View事件分发机制(一)

只是做一个总结,其他的下篇文章再讲

1. 同一个事件序列是指从手指接触屏幕的一刻开始,到手指离开屏幕的一刻结束,在这个过程中所产生的一系列事件,这个事件序列冲down事件开始,中间有数量不定的move事件,到up事件结束。

2. 正常情况下,一个事件序列,只能被一个View拦截且消耗,这一条原因可以参考 3,因为一个元素一旦拦截了某次事件,那么同一个事件序列内的所有事件都会交给这个元素来处理,因此同一个事件序列中的事件不能交给两个元素同时处理,但是通过特殊手段可以做到,比如一个View 将本该自己处理的事件通过OnTouchEvent强行传递给其他的View 来处理。

3. 某个View 一旦决定拦截,那么这一个事件序列都只能交给它来处理,并且他的OnInterceptTouchEvent 不会被调用。

4. 某个View 一旦开始处理事件,如果它不消耗ACTION_DOWN 事件,那么同一事件序列中的其他的事件都不会再交给它处理,并且事件会交给它的父元素去处理,即父元素的OnTouchEvent 会被调用。意思就是一个事件交给View 去处理,那么它必须消耗掉,否则同一事件序列中的其他的事件都不会再交给它去处理。就好比上级交给程序员一件事,如果这件事没有处理好,短期内上级就不会再把事件交给这个程序员去处理了。

5. 如果View 不消耗除ACTION_DOWN 以外的事件,那么这个事件就会消失,父类也不会调用OnTouchEvent,并且当前View 可以持续接收到后续的事件,最终这些消失的事件会传递给Activity 处理。

6. ViewGroup 不拦截任何事件,Android 的源码中ViewGroup 的 OnInterceptTouchEvent 默认返回的false。

7. View 没有OnInterceptTouchEvent 方法,一旦有事件传给他,那么OnTouchEvent 会被调用。

8. View 的 OnTouchEvent 默认都会消耗事件,除非他是不可点击的(clickable 和 longClickable 同时返回true)。longClickable 默认返回false,而clickable 需要分情况,button 默认返回true,textView 默认返回的是false。

9. View 的enable属性不会影响 OnTouchEvent 的默认返回值。哪怕一个 View 是 disable 状态的,只要他的 clickable 和 longClickable有一个返回的是true, 则 OnTouchEvent 就返回true。

10. onClick 会发生的前提是 View 是可以点击的并且它收到了 down 和 up 事件。

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



PS:下篇文章将从源码角度来分析事件分发机制。

猜你喜欢

转载自blog.csdn.net/sinat_29874521/article/details/79564972
今日推荐