Android view绘制 / 事件分发

1. View 的绘制

  • View 的绘制流程是从 ViewRootImpl 的 performTraversals() 方法开始的,它经过测量(measure)、放置(layout)和绘制(draw)三个过程才能把一个 View 绘制出来,measure() 方法用于测量 View 的宽高,layout() 用于确定 View 在父容器中的放置位置,draw() 负责做具体的绘制操作。
image

2. Android事件分发机制

    1. 事件分发流程
      1.1 Activity——>PhoneWindow——>DecorView——>ViewGroup——>自己的view ——>View
      1.2 ViewGroup的事件传递方法:
      dispatchTouchEvent
      onInterceptTouchEvent
      onTouchEvent
      1.3 View的事件传递方法:
      ViewdispatchTouchEvent
      ViewonTouchEvent
      当点击事件产生时,Activity会调用dispatchTouchEvent()方法; 从Activity如果传到最下层的View都没有组件处理该事件,该事件会依次回传到Activity
    1. 事件分发的本质
      2.1 将点击事件(MotionEvent)传递到某个具体的View & 处理的整个过程
      2.2 事件传递的过程 = 分发过程。
    1. 事件在哪些对象之间进行传递?
      3.1 ActivityViewGroupView。Android的UI界面由Activity、ViewGroup、View 及其派生类组成
      UI界面
    1. 事件分发的顺序 ?
      4.1 事件传递的顺序:Activity -> ViewGroup -> View
      4.2 1个点击事件发生后,事件先传到Activity、再传到ViewGroup、最终再传到 View
    1. 如果事件一直没有被消费,最后会传给Activity,如果Activity也不需要就被抛弃。
    1. 判断事件是否被消费是根据返回值,而不是根据你是否使用了事件。
    1. onTouchListener,onTouchEventonClick的优先级别

    onTouchListener—–>onTouchEvent—>onclick

    1. View的事件分发机制实际上就是一个经典的责任链模式,

    责任链模式:当有多个对象均可以处理同一请求的时候,将这些对象串联成一条链,并沿着这条链传递修改请求,直到有对象处理它为止。

    1. onClick()方法是在onTouchEvent()方法中的action==ACTION_UP的时候才执行的;
      onTouch()、onTouchEvent()、onClick()三个方法的执行优先级依次递减
    1. view事件执行顺序dispatchTouchEvent-> setOnTouchListener的onTouch->onTouchEvent,如果setOnTouchListener返回ture,后续事件onTouchEvent不在执行
    1. onClick是在onTouchEvent(event)方法中的,所以onTouch优先于onClick执行
    1. Android 点击事件执行顺序是Activity—>ViewGroup—>View
    1. 如果子View将传递的事件消费掉,ViewGroup中将无法接收到任何事件
    1. ViewGrouponInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,把事件交给自己处理,则会执行自己对应的onTouchEvent方法。返回false代表不对事件进行拦截,事件继续向下传递,默认返回false
2.1 Android 事件冲突应用场景
    1. 外部拦截法和内部拦截法
      1.1 外部拦截法: 就是在ViewGroup里使用onInterceptTouchEvent()拦截
      1.2 内部拦截法: 在子ViewdispatchTouchEvent()里调用 ,这行代码被调用,父类就不会拦截事件
      当传入的参数为true时,表示子组件要自己消费这次事件,告诉父组件不要拦截(抢走)这次的事件。
      getParent().requestDisallowInterceptTouchEvent(true)

你可能感兴趣的:(Android view绘制 / 事件分发)