Android的事件分发机制

学习Android的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群,群号码:364595326  我们一起学Android!

Android中view的事件传递是从上往下传递的,即事件总是先传递给父元素,然后父元素在把事件分发给子View。

事件分发传递过程中有一个很重要的对象:MotionEvent,MotionEvent有个方法getAction,该方法返回int类型,我们可以从该返回值中判断事件类型,典型常见的有以下三种:

ACTION_DOWN:手指刚点击屏幕时

ACTION_MOVE:手指在屏幕上移动

ACTION_UP:手机离开屏幕

我们把从手指触摸到屏幕开始直到手指离开屏幕所产生的​一系列事件叫做同一事件序列,一个事件序列包含一个ACTION_DOWN、若干个ACTION_MOVE、一个ACTION_UP。

事件的分发过程由三个很重要的方法来共同完成的:

1、public boolean dispatchTouchEvent(MotionEvent event)

View的分发事件,一个View只要能接收到事件,首先执行的是该方法,而且该方法是一定会执行​,这里我们就称它为分发事件。

2、public boolean onInterceptTouchEvent​(MotionEvent event)

View的拦截事件,正常情况下dispatchTouchEvent分发事件会调用该方法,该方法的返回值用以判断当前View是否要拦截该事件,返回true,则当前View的onTouchEvent方法将被调用,并且事件不会传递下去。这里我们需要注意一下,如果一个View决定拦截事件,也就是onInterceptTouchEvent返回true,那么在同一个事件序列的其余事件执行过程中并不会在调用该方法。这里我们就称它为拦截事件。

如果一个View(如TextView,直接继承于View而不是ViewGroup,不能添加子View),那么该View是没有onInterceptTouchEvent方法,而且一旦有事件传递给它,onToucheEvent方法将会被调用,除非设置不可点击的(clickable和longClickable同时设为false);​[备注:activity也没有onInterceptTouchEvent事件]

3、public boolean onTouchEvent(MotionEvent event)

View用来处理点击事件,返回值表示当前View是否消费了该事件,如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,而且接收不到下一次事件。换句话说就是:如果没消费,也就是说返回false,那么在同一事件序列的其余事件将不会在传递过来。​

如果一个View设置了onTouchListener事件,那么会先执行onTouchListener,然后根据返回值在判断是否要执行onTouchEvent方法(返回true则不执行onToucheEvent,反之亦然).​​

这里有段伪代码可以把这三个事件的关系表现出来(摘自:android开发艺术):​

public boolean dispatchTouchEvent(MotionEvent event){

    boolean consume = false;

    if(onInterceptTouchEvent(event)){

        consume = onTouchEvent(event);

    }​else{

        consume = child.dispatchTouchEvent(event);​

    }

    return consume;​

}​

相信大家都看得很清楚。

学习Android的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Android学习交流群,群号码:364595326  我们一起学Android!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值