问题:如果长按手势在子view内不会响应父控件的长按事件。
解决方法如下以LinearLayout为例
public class MyLinearLayout extends LinearLayout {
//按下的坐标
private int mLastX, mLastY;
private boolean isMove;
private final Runnable runnable;
//移动范围
private static final int TOUCH_MOVE = 15;
public MyLinearLayout(Context context) {
super(context);
runnable = this::performLongClick;
}
public boolean dispatchTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = x;
mLastY = y;
isMove = false;
//长按一定时间响应长按事件
postDelayed(runnable, ViewConfiguration.getLongPressTimeout());
break;
case MotionEvent.ACTION_MOVE:
if(isMove){
break;
}
//超出范围不再响应长按事件
if(Math.abs(mLastX -x) > TOUCH_MOVE
|| Math.abs(mLastY -y) > TOUCH_MOVE) {
isMove = true;
removeCallbacks(runnable);
}
break;
default:
//如果抬起或者取消action 取消长按事件
removeCallbacks(runnable);
}
return super.dispatchTouchEvent(event);
}
}