Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()Android中触摸事件传递过程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法

    

    Android中触摸事件传递过程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法。这个是困扰初学者的问题之一,我开始也是。这里记录一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的处理过程,以供记忆。


    dispatchTouchEvent是处理触摸事件分发,事件(多数情况)是从Activity的dispatchTouchEvent开始的。执行

super.dispatchTouchEvent(ev),事件向下分发。

    onInterceptTouchEventViewGroup提供的方法,默认返回false,返回true表示拦截。

    onTouchEvent是View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。


View里,有两个回调函数 :

public boolean dispatchTouchEvent(MotionEvent ev);  
public boolean onTouchEvent(MotionEvent ev); 

ViewGroup里,有三个回调函数 :

public boolean dispatchTouchEvent(MotionEvent ev);  
public boolean onInterceptTouchEvent(MotionEvent ev);  
public boolean onTouchEvent(MotionEvent ev);


在Activity里,有两个回调函数 :

public boolean dispatchTouchEvent(MotionEvent ev);  
public boolean onTouchEvent(MotionEvent ev);  



    Android中默认情况下事件传递是由最终的view的接收到,传递过程是从父布局到子布局,也就是从Activity到ViewGroup到View的过程,默认情况,ViewGroup起到的是透传作用。Android中事件传递过程(按箭头方向)如下图,图片来自[qiushuiqifei],谢谢[qiushuiqifei]整理。

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()


  

    触摸事件是一连串ACTION_DOWN,ACTION_MOVE..MOVE…MOVE、最后ACTION_UP,触摸事件还有ACTION_CANCEL事件。事件都是从ACTION_DOWN开始的,Activity的dispatchTouchEvent()首先接收到ACTION_DOWN,执行super.dispatchTouchEvent(ev),事件向下分发。

    dispatchTouchEvent()返回true,后续事件(ACTION_MOVE、ACTION_UP)会再传递,如果返回false,dispatchTouchEvent()就接收不到ACTION_UP、ACTION_MOVE。



下面的几张图参考自[eoe]


Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

                                             图1.ACTION_DOWN都没被消费






                                Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

                                                                  图2-1.ACTION_DOWN被View消费了


                                     Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

                                                   图2-2.后续ACTION_MOVE和UP在不被拦截的情况下都会去找VIEW


                              Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

                                                                    图3.后续的被拦截了


                              Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

                                                                       图4ACTION_DOWN一开始就被拦截



android中的Touch事件都是从ACTION_DOWN开始的:

单手指操作:ACTION_DOWN—ACTION_MOVE—-ACTION_UP

多手指操作:ACTION_DOWN—ACTION_POINTER_DOWN—ACTION_MOVE–ACTION_POINTER_UP—ACTION_UP.



/**

* @author 张兴业
*  http://blog.csdn.net/xyz_lmn
*  android开发进阶群:
281537853
*  iOS入门群:
83702688

*  我的新浪微博:
@张兴业TBOW

*/

今天的文章Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59804.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注