Android事件分发

下面是作者自己对Android开发的一个理念的理解
        Android 作为前端和客户交互一个产品app
        总体是 需要处理 View的一个自定义绘制
              需要处理 客户与手屏幕触摸事件分发
              需要处理 Java处理数据和设计理念
              需要处理 Android 和 JAVA 集合部分
        自己有感而发的 : 你不理解或者能理解我说了什么 自己体会吧

Android 事件分发机制

    事件传递
    Activity --> Window --->DecorView ---> ViewGroup --> View


   什么是事件分发?
    现在人们在使用手机时,都会通过手指对屏幕的触摸来完成交互过程
    对app是有多个页面实现的,每个页面是通过Activity承载的,
    在Activity上包含若干个ViewGroup和View,
    用户通过屏幕与手机交互的时候,每一次点击,长安,移动定都是一个事件.

    事件分发机制: 某一个事件从屏幕传递各个View,由View来使用这一事件(消费事件)或者忽略这一事件(不消费事件)
    这整个过程的控制
   所以所谓事件分发就是将事件传递到每个View的过程.这样一个概念转化成java面向对象就是封装成MotionEvent对象,
   分发过程就是分发MotionEvent的过程

   MotionEvent 通过事件类型有很多,我们一般主要使用使用这个4个,
   按下 (ACTION_DOWN)
   移动 (ACTION_MOVE)
   抬起 (ACTION_UP)
   取消 (ACTION_CANCEL)

  事件序列
    手指按下屏幕开始,到手指离开屏幕所产生的一些列事件
    首先产生action_down 事件 然后产生了action_move 再然后产生了action_up
    最后产生了action_cancel这些组合就是事件序列.

  指明这里的屏幕是指Activity,
  Activity不负责视图控制,它只负责生命周期,和处理事件
  真正控制视图的是一个Window是个抽象类代表了一个窗口,
  每一个Activity引用了一个Window对象,而Window是一个抽象类所以是用它子类PhoneWindow创建指向父类Window引用的
  而在Window之中还包含了一个DecorView, DectorView是Activity的顶级View,其中Activity setContentView是添加
  给DecorView的子元素,当我们事件都是通过DecorView传递我们子View.
  而DecorView继承了ViewGroup,所以事件又通过ViewGroup分发,分发到我们创建的一个个子的ViewGroup和View

  所以事件主要传递对象及顺序是 Activity  ViewGroup  View  这三个会按照上面所说的传递层级

Activity :处理
        1.dispatchTouchEvent(MotionEvent ev);
        2.onTouchEvent(MotionEvent event);
      事件在Activity中调用dispatchTouchEvent分发之中就会调用onTouchEvent
      这两个方法都会接口MotionEvent对象,
      如图片:Activity事件分发.jpg图片查看流程
      注意: dispatchTouchEvent调用onTouchEvent 之前回去ViewGroup 执行ViewGroup的disPatchTouchEvent方法
            如果返回true 就不知执行Activity.onTouchEvent方法了

ViewGroup :处理
        1.disPatchTouchEvent(MotionEvent ev);
        2.onInterceptTouchEvent(MotionEvent ev);

        *3.onTouchEvent(MotionEvent event); //当前ViewGroup是没有这个方法,这个方法在ViewGroup父类View中的
      事件如果进入到ViewGroup中首先会调用dispatchTouchEvent方法分发,
      onInterceptTouchEvent方法会在dispatchTouchEvent中调用,
      如果返回true就是表示事件拦截了不会在下发了,如果false就是不会拦截当前dispatchTouchEvent分发的事件

       onTouchEvent 方法不在ViewGroup中,为什么要使用这个那?
       是因为如果我们自定义了ViewGroup想让事件自己处理 就可以调用onInterceptTouchEvent方法返回true
       然后重写View中的onTouchEvent方法处理掉事件

       如图片:ViewGroup事件分发.jpg图片查看流程
       注意 : dispatchTouchEvent 里面只调用了onInterceptTouchEvent 方法, ViewGroup中没有onTouchEvent方法
                onTouchEvent是父类View中的方法
              ViewGroup事件分发中源码中代码很多, 其中有代码判断触摸事件是否符合安全策略
              如果返回false,事件就会跳过所有方法直接返回false,事件就未消费了
              如果返回true,事件就会去调用onInterceptTouchEvent是否会拦截了, 如果返回true就重写View中的onTouchEvent方法了
              自己处理事件消费了,如果返回false 就是不拦截 然后把事件传给子的ViewGroup或View了

View : 处理
       1.dispatchTouchEvent(MotionEvent ev);
       2.onTouchEvent(MotionEvent event);
      如果事件进入View首先调用dispatchTouchEvent方法分发 然后判断这个View是否有可响应的焦点,如果返回false
      就会跳过所以方法直接结束,如果返回true 就是可响应然后在调用 安全策略方法 如果返回false也直接结束,如果返回
      true 会接判断此事件是否为鼠标事件,如果是true 会返回true,事件消费结束,如果返回false ,会注册TouchListener监听
      onTouch()方法值,true,会返回true,事件消费结束,如果false 会监听onTouchEvent返回值,true,会返回true,事件消费结束,如果false
      返回fasle ,事件未消费 结束
      图片:View事件分发.jpg 流程图

      注意 : View中处理  分发, 焦点,安全策略,鼠标,监听TouchListener.onTouch()值,onTouchEvent, 判断地方也挺多的
Android事件分发_第1张图片 标题

 Android事件分发_第2张图片

 

你可能感兴趣的:(android,android)