事件拦截机制分析

事件拦截机制

触摸事件–MotionEvent

Android为触摸事件封装了一个类—-MotionEvent

  1. 1. 常用的事件常量
    - int ACTION_DOWN = 0;//单点触摸按下动作
    - int ACTION_UP = 1;//单点触摸离开动作
    - int ACTION_MOVE = 2;//触摸点移动动作
    - int ACTION_CANCEL = 3;//触摸动作取消
    - int ACTION_OUTSIDE = 4;//触摸动作超出界限
    - int ACTION_POINTER_DOWN = 5;//多点触摸按下动作
    - int ACTION_POINTER_UP = 6;//多点离开动作

我们通常就是以上不同的action来进行区分具体的事件,实现不同的逻辑

事件分发

我们都知道,Android的View是树形结构,view可以放在viewgroup中,而这个viewgroup也可以放在另外一个viewgroup中。也就是说可以层层嵌套很多层。那在这样一层结构中,我们的触摸事件是怎么分发给指定的view的呢?我先举个简单的例子,假如你是一个底层的程序员,那么你的上边有项目组长和项目经理。任务下达的时候,项目经理呢会把任务交给项目组长,项目组长呢会再把任务交给你,接下来你就是好好的完成任务了。那么这样一个分配的过程其实就和我们的事件分发是一样的。当触摸事件发生的时候,最先拿到的是最外层的那个viewgroup,他会把事件分给子view,然后一层一层往下分,直到最后一个view。(上边概述总结一句话就是从大到小分发,从小到大消费)

事件拦截

了解了上边的场景,我们队事件的分发和消费也有了一定的认识。基本上呢就是一层一层的分发到了最下层,才开始执行。你就记住,最底层的永远都是干活的。但是呢,假如现在有这样一个需求,我不想让这个事件发给最底层的view,我想让view的父布局来执行,那该怎么办呢?其实很简单,只需要重写事件拦截和处理的几个方法就行
对于viewgroup,我们需要重写三个方法,分别是:
- dispatchTouchEvent(MotionEvent ev)
- onInterceptTouchEvent(MotionEvent ev)
- onTouchEvent(MotionEvent ev)
对于view,只需要重写两个
- dispatchTouchEvent(MotionEvent ev)
- onTouchEvent(MotionEvent ev)
针对上边的方法,我们发现viewgroup比view多了一个方法,这个方法顾名思义就是事件拦截的核心方法,那么我们要解决上边的需求,重点也就是在这里。对于事件拦截方法是有返回值的,这个返回值就是代表着拦截不拦截,默认情况下是返回false的,也就是不拦截,如果我们需要拦截那么就重写然后将其返回true。那么事件就不会再向其下一层分发了。

总结

最后总结一下,正常情况下,事件的分发是:
项目经理—项目组长—你
事件的处理顺序是:
你—项目组长—项目经理
如果我们有需要,不让事件传递到最底层,那么我们就需要借助事件拦截的方法来进行拦截,具体情况具体制定。清楚了流程,剩下的就是具体的实战了。做项目的过程中,多想,多试,多总结。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值