Android View的事件分发机制(一)

      开发了Android2年了吧 ,开发经验确实很多了,但是说实话底层的东西知道的还是略少,今天就把我看到的有关Android View的点击事件分发和大家讲一下   

     在介绍点击事件的的传递规则之前,首先我们要明白我们要分析的对象就是MotionEvent,即点击事件。所谓的点击事件分发其实就对MotionEvent事件的分发过程,即当一个MotionEvent产生以后,系统需要把这个事件传递给一个具体的View,而这个传递过程就是分发。点击事件的分发过程由三个重要的方法来进行完成:diapathTouchEvent、onInterceptTouchEvent、onTouchEvent.下面先介绍一下下面几个方法:

         public boolean dispatchTouchEvent(MotionEvent ev):用来进行事件分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受到当前View的OnTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。

         public boolean onInterceptTouchEvent(MotionEvent ev):在上述方法内部调用,用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会在被调用,返回结果表示是否拦截当前事件。

         public boolean onTouchEvent(MotionEvent ev): 在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个时间序列中,当前View无法再次接收事件

         接下来,我们举个栗子来解释这三个方法具体调用关系:对于一个根ViewGroup来说,点击事件产生后,首先会传递它,这时它的dispatchTouchEvent就会被调用,如果这个ViewGroup的dispatchTouchEvent方法返回true就表示他要拦截此事件,接着这个事件就会交给ViewGroup处理,即它的onTouchEvent方法就会被调用;如果他的

onInterceptTouchEvent方法返回false,就表示他不拦截当前事件,这时当前事件就会继续传递给它的子元素,接着子元素的dispatchTouchEvent方法就会被调用,如此反复直到事件终究被处理。

         当一个View需要处理事件时,如果它设置了OnTouchListener,那么它的OnTouchListener的Ontouch方法会被回调,如果返回true,则onTouchEvent将不会被调用,否则将会被调用。由此可见,给View设置的OnTouchListener的优先级比onTouchEvent要高,然而在onTouchEvent方法中,如果当前设置的有OnClickListener,那么他的OnClick会被调用。也就是我们平时用的OnClickListener方法的优先级是最低的。


         

猜你喜欢

转载自blog.csdn.net/zanshiyonghuming/article/details/51907197