View的事件分发机制二--事件分发规则

在详细介绍事件分发源码的时候,先大概了解一下事件分发的规则,大家可以去参考android开发艺术探索这本书,里面讲解的蛮深入的。

1:我们常说的同一事件序列,指的是当我们手指触摸到屏幕的那一瞬间产生的ACTION_DOWN,到手指离开屏幕的那一瞬间所产生的ACTION_UP之间的一系列事件。这个序列是由一个ACTION_DOWN ,多个ACTION_MOVE和一个ACTION_UP组成的。

2:正常情况下,一个事件序列只能有一个View来处理。当一个View调用了OnInterceptOnTouchEvent函数成功拦截了这个事件,系统就会认为这个事件序列可以由这个View来处理,而且接下来这个View不用再调用OnInterceptOnTouchEvent函数就可以处理同一事件序列中的下几个事件,因为同一事件序列不能分别由俩个View来处理,要不然就乱套了。

3:某个View一旦决定拦截,那么这个事件序列都只能由它来处理,并且OnInterceptTouchEvnet函数不会再被调用。

4:某个View一旦决定处理事件,如果它不能消耗ACTION_DOWN事件,那么接下来的事件都不会交给它来处理,并且将事件重新交给父元素处理,即父元素的OnTOuchEvent会被调用。由此看来在事件处理中ACTON_DOWN事件非常的重要。事件一旦交给某个View处理,这个View必须消耗掉这个事件,否则同一事件序列中的其他事件就不会叫给他了。

5:如果某个View消耗了ACTION_DOWN但是不能消耗接下来的ACTION_MOVE 和ACTION_UP ,那么这个事件就会消失,此时父元素的onTouchEvent不会被调用,并且当前View可以继续收到后续的事件,最终这些事件都会交给Activity来处理。

6:ViewGroup中默认不拦截任何事件,它的onInterceptTouchEvent函数默认返回false.

7:View没有onInterceptTouchEvent函数,只要事件传递到这个View,那么它的onTouchEvent就会被调用。

8:View的onTouchEvent函数默认返回true(如果clickable和longClickable不同时为false)。View的longClickable 默认为false,clickable视情况而定,例如:textView的clickable 为false,Button的clickable为true。

9:View的onTouchEvent函数的返回值不受View的enabel 属性的影响。无论View的enable属性为true还是为false,View都默认返回true(只要clickable和longclickable属性不同是为false)

10:onClick函数被调用的前提:
1)View是可点击的即clickable=true;
2)onTouch方法返回了false
3)在onTouchEvent 中调用了super.onTouchEvent或则不重写View的onTouchEvent.
4)有MOTION_UP事件发生

11:事件的分发是由外向内,事件总是有父元素分发给子元素,在子元素中可以调用requestDisallowInterceptTouchEvent函数来干预父元素的事件分发,但是ACTION_DOWN事件通过这个函数无法干预。这个函数可用作为滑动冲突的一种解决方法。

你可能感兴趣的:(移动开发)