Android 事件分发
博客专区 > xjfxjf 的博客 > 博客详情
Android 事件分发
xjfxjf 发表于2年前
Android 事件分发
  • 发表于 2年前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

 Android 的事件分发过程如下:

首先Android的事件会分发到Activity里面,然后再往View视图下面分发,在View视图里面,会先分发到父视图,再往子视图分发,全部流程如下:

首先会调用Activity的dispatchEvent方法,然后会调用ViewGroup的DispatchEvent()方法,这时候就要分几种情况讨论了,首先,事件分为Down,Move,Up事件,

1,假设父类不拦截事件,也不消费事件,即ViewGroup的onInterceptTouchEvent()返回false,而且ViewGroup没有实现OnClick()方法,也没有实现onTouch方法(或者onTouch方法有实现,但返回false,即不消费事件),也没有实现onTouchEvent方法(或者实现了onTouchEvent()但返回false,即代表不消费事件),此时,只讨论子view,子view也分两种,一种是可点击的(Button),另一种是不可点击的(TextView),此时再分两种情况讨论,

(1)可点击子view,这种View是默认可点击的,即默认onTouchEvent()方法默认返回true,即会消费任何事件,假设这种view有实现onTouch()方法,并且返回true,则事件会先分发到此处,并且不会继续往下分发,如果返回false,则事件会继续往下分发,则继续调用onTouchEvent()方法,假设有实现onClick方法,那么OnClick方法是在调用onTouchEventh后的up事件之后调用它的。

可点击的默认消费所有事件,假设这个子View是自定义的,并且继承可点击的view,如果在自定义它只消费Down事件,那么,剩余的事件会继续往这个view分发,但由于父类事件不拦截,不消费,那么Move事件会传到这个View,但他不消费之后,这个事件会直接调用Activity的onTouchEvent事件,up事件也是一样。

假设这个view消费Down事件和Move事件,那么up事件一样会传到这个View上,但UP事件由于不被消费,所以直接返回调用Activity的onTouchEvent方法,

假设这个View不消费Down,Move和UP事件,那么当事件传到这个View时,他会一步一步往上传给父控件,即调用父控件的onTouchEvent方法,由于父类默认不拦截,那么事件会逐步返回到Activity上,并且调用Activity的onTouchEvent方法,然后剩余的事件都不会往下传递了,都由Activity消费

由于继承可点击和不可点击的控件的事件传输是一样,都是由onTouchEvent的返回值控制,

2当父类ViewGroup拦截事件时,即onInterceptTouchEvent()方法返回true,那么事件疆全部由父类消费,不会传递到子类,此时事件会去调用它的onTouchEvent方法,假如消费Down事件返回true,那么接下来的事件都会去分发到这里,如果Move事件不消费,那么就会直接调用Activity的onTouchEvent方法,up事件也是,如果只消费Move事件,那么Down事件会传递到这个onTouchEvent里面,由于不消费,那么事件会逐步往上传递,最终传递到Activity的onTouchEvent里面。那么接下来的Move事件就不会传递下来,而是直接在Acitivty里面被消费。

 

3假设ViewGroup拦截Move事件,但不消费事件,那么当事件穿戴到子view时,如果子view消费

事件,那么接下来的事件也会分发下去,当遇到Move事件时,那么那个时间就会被ViewGroup拦截,并且调用ViewGroup的onTouchEvent,由于ViewGroup只拦截,不消费,那么事件会直接分发给Activity,即调用Activity的onTouchEvent方法。而接下来的up事件,即便ViewGroup拦截,也不会被ViewGroup消费,而是直接分发给那个消费Down事件的view。

4假设ViewGroup只拦截up事件,那么事件会直接分发给子view,而不是自己消费。

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 2
码字总数 1194
×
xjfxjf
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: