下面先说View的事件分发,背景:
1.自定义MyButton控件继承自Button,在其中重写dispatchTouchEvent()和onTouchEvent()方法
2.编写xml布局文件,在主Activity中实例化控件MyButton,并在按钮上添加setOnTouchListener的监听事件,监听事件中会重写onTouch方法。
点击MyButton按钮,并稍微挪动一下,然后会看到执行顺序为:
dispatchTouchEvent() ---->setOnTouchListener的onTouch() ---------->onTouchEvent()
当设置了setOnTouchListener,并返回了true,那么MyButton的onTouchEvent就不会被执行
下面讲ViewGroup的事件分发机制,背景:
1.自定义MyLinearLayout继承自LinearLayout,在MyLinearLayout中重写dispatchTouchEvent(),onTouchEvent()和onInterceptTouchEvent()方法
2.在xml文件中让MyLinearLayout包含上面的MyButton控件,并将其显示在主Activity中
点击MyButton按钮,并稍微挪动一下,然后会看到执行顺序为:
MyLinearLayout的dispatchTouchEvent -> MyLinearLayout的onInterceptTouchEvent -> MyButton的dispatchTouchEvent ->Mybutton的onTouchEvent
当onInterceptTouchEvent 返回true时,子View的事件将被拦截,后续动作都不会被触发,ViewGroup的onTouchEvent被触发
没有拦截时,将交给子View处理,ViewGroup将不处理,ViewGroup的OnTouchEvent将不被触发
子View可以通过调用getParent().requestDisallowInterceptTouchEvent(true); 阻止ViewGroup对其MOVE或者UP事件进行拦截;