用到:
1.android的onClick()和onTouch()方法详解
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG", "onClick execute");
}
});
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("TAG", "onTouch execute, action " + event.getAction());
return false;
}
});
可以看到,onTouch是优先于onClick执行的,并且onTouch执行了两次,一次是ACTION_DOWN,一次是ACTION_UP(你还可能会有多次ACTION_MOVE的执行,如果你手抖了一下)。因此事件传递的顺序是先经过onTouch,再传递到onClick。
onTouch方法是有返回值的,这里我们返回的是false,如果我们尝试把onTouch方法里的返回值改成true,
onClick方法不再执行了!为什么会这样呢?你可以先理解成onTouch方法返回true就认为这个事件被onTouch消费掉了,因而不会再继续向下传递。
2。悬浮窗
// 随意拖动的悬浮窗
private class FloatingOnTouchListener implements View.OnTouchListener {
/*
https://blog.csdn.net/dongzhong1990/article/details/80512706
*/
private int x;
private int y;
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = (int) event.getRawX();
y = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int nowX = (int) event.getRawX();
int nowY = (int) event.getRawY();
int movedX = nowX - x;
int movedY = nowY - y;
x = nowX;
y = nowY;
wmParams.x = wmParams.x + movedX;
wmParams.y = wmParams.y + movedY;
// 更新悬浮窗控件布局
mWindowManager.updateViewLayout(mFloatLayout, wmParams);
break;
default:
break;
}
return false;
}
}
- 控件里添加 监听
button.setOnTouchListener(new FloatingOnTouchListener());
下载地址: