美文网首页Android开发
View事件分发机制知识点(一)

View事件分发机制知识点(一)

作者: 二城默 | 来源:发表于2018-10-11 17:35 被阅读4次

1.OnTouchListeneronTouchEventOnClickListener

当一个View需要处理事件,如果设置OnTouchListener,那么OnTouchListener中的onTouch会被回调,如果onTouch返回true,那么onTouchEvent方法不会被调用;如果返回false,则当前View的onTouchEvent方法会被调用(OnTouchListener优先级大于onTouchEvent),设置了OnClickListener,那么它的onClick方法会被调用,可以看出,我们平时用的OnClickListener,优先级最低,处于事件传递的尾端。

2.一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View(顶级),顶级View接收到事件后,按照事件分发机制去分发事件,根ViewGroup的dispatchTouchEvent被调用,如果这个ViewGroup的onInterceptTouchEvent方法返回true就表示它要拦截当前事件,接着事件就会交给这个ViewGroup处理,即它的onTouchEvent方法就会被调用;如果这个ViewGroup的onInterceptTouchEvent方法返回false,就表示它不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用,直到事件被最终处理。

3.如果一个View的onTouchEvent返回false,那么它的父容器的onTouchEvent将会被调用,如果所有元素都不处理这个事件, 那么这个事件将会最终传递给Activity处理,即Activity的onTouchEvent方法会被调用

4.View没有onInterceptTouchEvent方法,一旦有点击事件传递给它,那么它的onTouchEvent方法就会被调用。ViewGroup默认不拦截任何事件。Android源码中ViewGroup的onInterceptTouchEvent方法就会被调用。

5.View的onTouchEvent默认都会消耗事件(返回ture),除非它是不可点击的(clickable和longClickable同时为false),View的longClickable默认false,clickable属性分情况(Button默认true,TextView默认false)。

6.事件传递过程是由外向内的,即事件总是先传递给父元素,然后再由父元素分发给子View,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是ACTION_DOWN事件除外。

相关文章

网友评论

    本文标题:View事件分发机制知识点(一)

    本文链接:https://www.haomeiwen.com/subject/ndybaftx.html