View的事件分发机制

来源:互联网 发布:中国电信宽带网络测速 编辑:程序博客网 时间:2024/06/18 11:02

View的事件分发


1.dispatchTouchEvent返回true,表示该View或者该View的子View或子子VIew中已经处理了事件。反之则表示没有view处理事件。

2.onInterceptTouchEvent只有在ViewGroup中才可以调用。返回true表示拦截这个事件自己进行处理,这个事件不会再传递到子view中了。返回false则表示不主动对事件进行处理,除非子view都没有处理。

3.onTouchEvent返回true,表示事件已经被处理,事事件传递的终点。

1.情境1,:Activity中有一个ViewGroup,ViewGroup中有一个View,该view是Clickbale

当我们触发事件比如点击事件时,用activity最先开始事件分发,触发Activity的dispaTouchEvent方法(视作方法的嵌套,最外层为Activity的dispatchTouchEvent方法,该方法开始执行,但并没有结束,而是执行内部的方法,只有在该事件在内部被处理完之后,接收到处理结果,将该结果返回,最外层方法ca结束),将事件传递给ViewGroup,激发dispatchTouchEvent方法,再激发onInterceptTouchEvent,,所以viewGroup不需要拦截,所以onInterceptTouchEvent返回false,该方法结束。继续传递给view,激发view的dispatchTouchEvnent方法,view通过onTouchEvent方法,处理点击事件,返回true,onTouchEvent方法执行结束。view的dispatchTouchEvent方法接收参数true,进行返回。View的dispatTouchEvent执行结束。viewGroup接收view处理事件结果,进行返回,viewgroup的dispatchTouchEvent方法执行结束,将返回值传递给activity,activity将参数作为dispatchTouchevent的返回值,dispatchTOuchEvent执行结束。至此整个事件分发结束。


2.情境2:Activity中有一个ViewGroup,ViewGroup中有一个View,该view是Clickbale,即不消费事件的情况

前面流程一致,在view中onTouchEvent返回结果为false;因此viewGroup中dispatchTouchEvent方法返回false,activity也返回false。在之后的事件当中,activity已经知道他的viewgroup和view都不会对事件消费,因此之后事件只有activity进行处理,activity执行onTouchEvent方法返回false,dispatchTouchEvent也返回false。


3 情境3.viewGroup对事件进行拦截

在viewGroup中的onInterceptTouchEvent方法手动更改返回值为true,子View便不会收到该事件,也不会调用子view中的方法。而是直接调用viewGroup中的onTouchEvent方法,如果viewGroup为clickable则处理结果为true。将结果继续向上传递。而之后的事件中,便不会再进行判断是否拦截,即onInterceptTouchEvent方法不会执行,直接执行onTouchEvent方法。

另外一种情况:在事件序列中刚开始不进行拦截,之后在MOVE事件中进行拦截。那么在拦截的时候,便会通知子view不再接收MOVE事件。之后其它后续事件也跟上面情况一样,直接在viewGroup中处理,不会再让子view处理。



0 0