View和ViewGroup的事件分发机制详解

来源:互联网 发布:飞思卡尔单片机选型 编辑:程序博客网 时间:2024/05/22 09:04

下面先说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事件进行拦截;

0 0
原创粉丝点击