本文是自己测试实际代码得出的结果。布局内容是LinearLayout-->ReleativeLayout-->Button
情况一 (方法为默认方法)
// ACTION_DOWN = 0;
// ACTION_UP = 1;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
LogUtils.logv(" CustomerLinearLayout ---> onInterceptTouchEvent");
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
LogUtils.logv(" CustomerLinearLayout ---> dispatchTouchEvent " + ev.getAction());
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
LogUtils.logv(" CustomerLinearLayout ---> onTouchEvent");
return super.onTouchEvent(event);
}
微信截图_20200702105525.png
如果CustomerLinearLayout 的dispatchTouchEvent 返回true则结果为
微信截图_20200702110328.png
只执行他自己的dispatchTouchEvent方法,且两次(ACTION_DOWN和ACTION_UP)
如果返回false,则只有ACTION_DOWN事件,没有ACTION_UP事件,dispatchTouchEvent只执行一次
由上面可以知道,根据dispatchTouchEvent的返回结果有三种情况,super.dispatchTouchEvent()、true、false
如果CustomerLinearLayout 的onInterceptTouchEvent 返回true(只有 dispatchTouchEvent返回super方法时),则结果为
3.png
此时执行onTouchEvent()方法。onInterceptTouchEvent的源码默认返回false。
当CustomerLinearLayout 的dispatchTouchEvent 返回的是super方法的时候。
这个时候看CustomerRelativeLayout
如果dispatchTouchEvent 返回true。则与CustomerLinearLayout 的情况一致。CustomerRelativeLayout的dispatchTouchEvent 方法执行两次(ACTION_DOWN和ACTION_UP)
如果dispatchTouchEvent 返回false。则会执行其父类的onTouchEvent(),且流程执行一次,只有ACTION_DOWN事件
4.png
如果如果CustomerRelativeLayout 的onInterceptTouchEvent 返回true,(只有 dispatchTouchEvent返回super方法的时候)
7.png
总结如下
同名方法时 super方法
20190120122256828.png
网友评论