【Android】View的事件分发机制

一、MotionEvent事件

手指接触屏幕后所产生的事件,主要有如下几种:
 1、ACTION_DOWN:手指接触屏幕
 2、ACTION_MOVE:手指在屏幕上移动
 3、ACTION_UP:手指从屏幕上松开
通常有如下的一系列事件:
 1、点击屏幕后离开松开,事件序列为DOWN->UP
 2、点击屏幕滑动一会再松开,事件序列为DOWN->MOVE->MOVE->…->MOVE->UP

二、View的事件分发机制

View的事件分发机制其实就是对MotionEvent事件的分发过程,当一个MotionEvent(即点击事件)产生后,需要把这一个事件传递给一个具体的View。点击事件的分发过程由dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法组成:
 1、public boolean dispatchTouchEvent(MotionEvent ev)
 用于处理事件的分发,如果事件传递给当前的view,那么此方法一定会被调用,返回结果受到当前view的onTouchEvent和下级view的dispatchTouchEvent方法的影响,表示是否消耗当前事件。
 2、public boolean onInterceptTouchEvent(MotionEvent ev)
 用来判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列中,此方法不会再次被调用。
 3、public boolean onTouchEvent(MotionEvent ev)
 用于处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则当前view无法再次接受到事件。

上述三个方法的逻辑如下:

public boolean dispatchTouchEvent(MotionEvent ev){
    boolean consume = false;
    if(onInterceptTouchEvent(ev)){    //拦截,当前view处理点击事件
        consume = onTouchEvent(ev);
    } else {                          //不拦截,子view处理点击事件
        consume = child.diapatchTouchEvent(ev);
    }
    return consume;
}

传递流程如下:
(1)事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或者拦截,从最上层的view(viewGroup)开始一直往下(子view)传递。子view可以通过onTouchEvent()对事件进行处理。
(2)事件由父view(viewGroup)传递给子view,viewGroup可以通过onInterceptTouchEvent()对事件进行拦截,停止其往下传递。
(3)如果事件从上往下传递的过程中没有被拦截,最底层的view也没有消耗事件,事件会反向往上传递,这时父view(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()方法中处理。
(4)如果 View 没有对 ACTION_DOWN 进行消费,之后的其他事件不会传递过来。
(5)OnTouchListener 优先于 onTouchEvent()对事件进行消费。
这里写图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值