《Android高级进阶》读书笔记——第一章:Android 触摸事件传递机制

Android 触摸事件传递机制

触摸事件的类型

  • ACTION_DOWN:手指按下操作
  • ACTION_MOVE:手指按下后到松开前,移动距离超过一定阀值
  • ACTION_UP:手指离开屏幕的操作

在一次屏幕触摸操作中,ACTION_DOWN和ACTION_UP 这两个事件是必须的

事件传递的三个阶段

  • 分发 dispatch

    • 事件的分发对应着 dispatchTouchEvent(Motion event)

      public boolean dispatchTouchEvent(MotionEvent ev)
    • 在该方法中,根据当前视图的具体实现逻辑,来决定是直接消费这个事件还是继续分发给子视图处理

      • 返回值为true 标识事件被当前视图消费调,不再继续分发
      • 返回值为super.dispatchTouchEvent 表示继续分发该事件,如果当前视图是ViewGroup及其子类,则会调用onInterceptTouchEvent判断是否拦截
  • 拦截 intercept

    • 事件的拦截对应着onInterceptTouchEvent方法,这个方法只在ViewGroup及其子类中才存在,在view和Activity中是不存在

      public boolean onInterceptTouchEvent(MotionEvent ev)
    • 该方法通过返回值决定是否拦截对应事件

      • 返回true 表示拦截 不继续分发给子视图,同时交给自身的onTouchEvent方法进行消费
      • 返回false或者super.onInterceptTouchEvent表示不对事件进行拦截,需要继续传递给子视图
  • 消费 Consume

    public boolean onTouchEvent(MotionEvent event)
    • 返回true 当前视图可以处理对应事件,事件将不会向上传递给父视图
    • 返回false 表示当前视图不处理这个事件,事件将会传递给父视图的onTouchEvent方法进行处理
  • Android系统中,拥有事件传递和处理的类的分类

    • Activity: 拥有dispatchTouchEvent和onTouchEvent两个方法
    • ViewGroup:拥有dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个方法
    • View 拥有dispatchTouchEvent和onTouchEvent两个方法

View事件传递机制

  • View控件本身已经是最小单位,所以不能再作为其它View的容器

dispatchTOuchEvent、onTouchEvent的返回值不同对应的情况

  • 触摸事件的传递流畅是从dispatchTouchEvent开始的,事件会依次按照嵌套层从外层向内层传递。到达最内层的view时,就由它的onTouchEvent方法处理,如果该方法消费touch事件,则返回true,如果消费不了Touch事件则返回false,此时事件会重新向外层传递,并由外层的onTouchEvent方法进行处理
  • 如果事件在向内层传递的过程中被干预,事件处理返回true则会导致事件提前被消费掉,内层的view将不会收到这个事件
  • View控件的事件触发顺序是先执行onTouch方法,在最后执行onClick方法。如果onTouch方法返回true,则事件不会继续传递,最后也不会调用onClick方法;如果返回false则继续传递

image

ViewGroup事件传递机制

  • 触摸事件的传递顺序是由Activity到ViewGroup 再由ViewGroup递归传递给它的子View
  • ViewGroup通过onInterceptTouchEvent对事件进行拦截,如果该方法返回true则事件不会传递,代表ViewGroup拦截了事件,如果该方法返回false或者是返回super代表ViewGroup不拦截事件则会将事件传递给子View
  • 在子View中对事件进行消费后,ViewGroup将接收不到任何事件

注意

  • 所有的事件传递的机制都是 先传递后处理,也就是说 对于嵌套ViewGroup的结构来说:
    • 用户触摸事件发生在Activity,Activity先分发,如果Activity表示super方法表示Activity要将事件分发,则会分发给ViewGroup的分发方法,如果ViewGroup返回super表示ViewGroup也要分发,则分发给子View的分发,如果子View的分发返回super则表示子View也要分发,则会向上返回,会执行Activity的onTouch方法,如果Activity的onTouch返回false则直接会执行子view的onTouchEvent方法,如果返回super代表子view处理事件,返回true也代表子view处理事件,如果中间遇到干预,比如Activity的分发选择true或false则不再继续分发,事件也不会被消费。如果ViewGroup的分发方法返回true表示不分发,则事件不消费,如果ViewGourp的分发方法返回false则直接 执行Activity的onTouchEvent.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值