如果想要设置自定义Toast可以移动,比如来电显示时候显示归属地的Toast,这时候就希望是可以移动的。
原理就是给自定义的Toast设置一个触摸监听器,首先获取初始触摸位置坐标,然后通过移动事件(MotionEvent.ACTION_MOVE)来动态改变Toast在窗体上的位置。
当然首先要自定义一个Toast,参考我的上一篇自定义Toast,先自定义一个Toast,然后修改某些属性
//给Toast设置一个初始位置,其实不设置初始位置也可以,随你自己。
params.x = 100;
params.y = 100;
//这个标志属性要去掉不可触摸的属性,以便设置触摸监听器
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
//这里是设置这个窗体为电话级别的属性,可以永远在上面,
//设置这个属性要记得添加权限:android.permission.SYSTEM_ALERT_WINDOW
params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
然后设置触摸监听器:
llMyToast.setOnTouchListener(new View.OnTouchListener() {
int startX ;
int startY ;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN://按下事件
//获取初始位置
startX = (int)event.getRawX();
startY = (int)event.getRawY();
break;
case MotionEvent.ACTION_MOVE://移动事件
mParams.x += (int)event.getRawX() - startX;
mParams.y += (int)event.getRawY() - startY;
//更新界面
windowManager.updateViewLayout(llMyToast,mParams);//这是更新View在界面的位置
//更新初始位置
startX = (int)event.getRawX();
startY = (int)event.getRawY();
break;
case MotionEvent.ACTION_UP://抬起事件
break;
}
return true;
}
});
好了,经过以上操作就可以自由拖动你的Toast了!
PS:一定注意要添加权限哦!android.permission.SYSTEM_ALERT_WINDOW