美文网首页
4.2View相关-事件分发机制详解

4.2View相关-事件分发机制详解

作者: 205蚁 | 来源:发表于2018-11-09 11:45 被阅读0次

    事件分发机制

      1. 为什么会有事件分发机制
      1. 三个重要的事件分发的方法
      1. 事件分发流程

    1.为什么会有事件分发机制

      1. android上的View是以属性结构绘制,所以说View的控件有可能重叠 在一起,所以当我们点击一块地方的时候,重叠的View可以同时相应,这时系统把点击事件判给谁呢?为了解决这个问题,就有了事件分发机制
        图1、图2
        PhoneWindow
        Decorview
        RootView
        ViewGroupA view2
        view1
      1. 屏幕上没有View遮挡的部分,就会显示主题的颜色,而不仅如此,最上面的标题也没有出现在layout布局当中,这个标题显示在哪呢?主题 颜色和标题栏就是显示在DecorView当中
      1. Phonewindow 是抽象类Window的实现类
        Window是所有视图的最顶级容器,包括了背景的显示,标题栏,事件的处理都是在Window管理范畴里。这个View对顶层的管理容器。真正的唯一实现类Phonewindow,
        DecorView是Phonewindow的内部类。

    2.三个重要的事件分发的方法

    事件传递,事件分发到底是啥?

      1. dispatchTouchEvent
      1. onInterceptTouchEvent
      1. onTouchEvent
    • Activity和View是没有第二个拦截事件的
      1.Activity拦截事件会导致整个屏幕无法响应事件,这不是我们想要的用户体验的效果
      2.View为事件传递的最末端,要么消费事件,要么不处理,没必要进行事件事件拦截,他的下面已经没有可以分发事件的子控件了

    2.1 dispatchTouchEvent 最重要

    • 决定了触摸事件是由自己的onTouchEvent处理还是分发给子View,让子View 递归的调用自身的dispatchTouchEvent来处理dispatchTouchEvent 和onInterceptTouchEvent的关系
      前者会调用后者来判断是否进行拦截事件

    2.2 onInterceptTouchEvent,拦截事件

    • 当父控件下发事件给子控件进行处理的时候,如果子控件需要对事件进行处理,他就会在onIntercepTouchEvent这个里进行拦截,然后到子控件的onTouchEvent里面做触摸事件的监听和一些逻辑的判断

    2.3 onTouchEvent

    • View当中的一个方法,按下,移动,放开,取消

    3.事件分发流程

    Activity->PhoneWindow->DecorvView->ViewGroup->...->View

    如果最后一个View没有消费事件,这个事件会反转到Activity最后被抛弃,责任链模式,上层的View 既可以拦截事件进行事件的处理,也可以下发询问子View是不是处理,如果是最底层了也没处理,就会返回到Activity

    实例:图

    4.事件的处理

    1.外部拦截发:父容器重写onInterceptTouchEvent

      1. ACTION_DOWN
        返回false不拦截。必须,否则会接收所有后续事件
      1. ACTION_MOVE
        做判断 返回是否拦截
      1. ACTION_UP
        不拦截,拦截了可能导致子控件up事件没收到,点击的up条件无法满足

    2.内部拦截法

      1. 要求父容器onInterceptTouchEvent 不能拦截down事件 。
        事件处理都不能拦截down,ACTION_DOWN事件不受FLAG_DISALLOW_INTERCEPT标志位的影响
      1. 子控件dispatchTouchEvent方法中
        1. ACTION_DOWN
          parent.requestDisallowInterceptTouchEvent(true);
          //请求父容器不拦截事件。 down事件处理 见上1
        1. ACTION_MOVE
          若判断到父容器需要此类点击事件
          则将parent.request方法 置false,允许父控件拦截,否则一直是不允许拦截的
        1. ACTION_UP
          不处理
          一直返回 return super.dispatchTouchEvent(event);

    相关文章

      网友评论

          本文标题:4.2View相关-事件分发机制详解

          本文链接:https://www.haomeiwen.com/subject/njgnxqtx.html