Android-java文件MainActivity事件

小白 2020-01-16 原创文章


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


Android中触摸事件传递过程中最重要的是

dispatchTouchEvent()、

onInterceptTouchEvent(),

onTouchEvent()方法。

这个是困扰初学者的问题之一,我开始也是。这里记录一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的处理过程

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

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

    onInterceptTouchEvent是ViewGroup提供的方法,默认返回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]整理。

    触摸事件是一连串

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。


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

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

多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP

————————————————

版权声明:本文为CSDN博主「xyz_lmn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/xyz_lmn/article/details/12517911


站点信息