Android探索------触摸事件传递机制分析

在Android中,所有的触摸事件都可以总结成三类:

  • 按下(ACTION_DOWN)
  • 移动(ACTION_MOVE)
  • 抬起(ACTION_UP)

所有的事件都会始于按下(ACTION_DOWN),然后接下来可能是一段移动(ACTION_MOVE)然后抬起(ACTION_UP),或者是按下操作执行完成后没有移动就直接抬起。
在Android手机上,本质上与我们进行交互的就是各类控件,诸如Button、Textview等等。而这些控件最终都是继承自View和ViewGroup。
那么View和ViewGroup中是通过哪些方法来对这些事件进行响应并分发呢?

View.java中
public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)
ViewGroup.java中
public boolean dispatchTouchEvent(MotionEvent ev)
public boolean onTouchEvent(MotionEvent event)
public boolean onInterceptTouchEvent(MotionEvent ev)

其实在查看ViewGroup.java的源码时我们可以看到:

public abstract class ViewGroup extends View implements ViewParent, ViewManager {

二者都存在相同的两个方法,即:

public boolean dispatchTouchEvent(MotionEvent event)
public boolean onTouchEvent(MotionEvent event)

下面我们来大概说说这些方法是干嘛用的呢?
我们可以看到,这些方法接收的参数都是MotionEvent,我们可以跟踪MotionEvent的源码

public final class MotionEvent extends InputEvent implements Parcelable

继承了InputEvent,里面是定义了各类触摸事件的。
这些方法返回的是boolean值,既然是传递,那么肯定就会存在拦截。因此这个返回值,我们不难理解。

  • 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
    如果事件分发返回 true,表示改事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结。如果你不想 Activity 中的任何控件具有任何的事件消费能力,
    如果事件分发返回 false,表明事件在本层不再继续进行分发,并交由上层控件的 onTouchEvent方法进行消费。
    如果事件分发返回系统默认的 super.dispatchTouchEvent(ev),事件将分发给本层的事件拦截 onInterceptTouchEvent 方法进行处理

  • 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
    如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由本层控件 的 onTouchEvent 进行处理;
    如果返回结果是false;则表示不对事件进行拦截,事件得以成功分发到子View。并由子View的dispatchTouchEvent进行处理。
    如果返回super.onInterceptTouchEvent(ev),事件默认不会被拦截,交由子View的dispatchTouchEvent进行处理。

  • 事件响应:public boolean onTouchEvent(MotionEvent ev)
    如果onTouchEvent返回true,表示onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。
    如果onTouchEvent返回false,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层View的onTouchEvent进行处理。
    如果返回super.onTouchEvent(ev),则默认处理的逻辑和返回false时相同。

总结:
从以上过程中可以看出,dispatchTouchEvent无论返回true还是false,事件都不再进行分发,
只有当其返回super.dispatchTouchEvent(ev),才表明其具有向下层分发的愿望,
但是是否能够分发成功,则需要经过事件拦截onInterceptTouchEvent的审核。

如有不对的地方,还请各位看官多多指教。谢谢

这里也推荐一篇关于事件传递分析文章的链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值