Touch事件的传递机制笔记

Touch事件传递

  事件序列:ACTION_DOWN, ACTION_MOVE, ACTION_UP

Touch事件传递涉及到的方法:

  1. dispatchTouchEvent(分发事件)
  2. onInterceptTouchEvent(拦截事件)
  3. onTouchEvent(处理触摸事件)

Touch事件的传递过程:

  • 父容器拿到事件,不拦截,事件就分发给孩子,如果孩子不消费事件,事件又传递给父容器,看父容器是否消费(onTouchEvent)
  • 如果ACTION_DOWN事件没有view消费,那么后续的事件ACTION_MOVE,ACTION_UP就不会传递进来
  • 父容器拿到事件,不拦截,事件就分发给孩子,如果孩子消费事件,事件传递结束
  • 父容器拿到事件,拦截,事件就不会分发给孩子,交给自己处理(onTouchEvent)
  • 如果点击的位置没有孩子,事件也不会传递给孩子

Activity与事件传递

  1. Activity获取事件,调用dispatchTouchEvent分发给PhoneWindow
  2. PhoneWindow的DecorView将事件分发给所有的view
  3. 没有任何view消费事件,就会调用Activity的touchEvent

View点击事件的触发和拦截

  点击事件的触发:View的onTouchEvent ACTION_UP, performClick
  点击事件拦截:onInterceptTouchEvent return true

setOnTouchListener与 onTouchEvent的关系

  在dispatchTouchEvent方法里面会先调用onTouch方法,如果onTouch返回true,直接返回,不会调用到onTouchEvent

Touch事件冲突

  有条件的拦截

滚动的处理

  View的滚动时是滚动View里面绘制的内容,View本身的位置没有动

    • View的scrollTo(x, y)
      x为正,向左滚,x为负,向右滚

    • View的scrollBy(x, y)
      scrollTo(mScrollX + x, mScrollY + y);
      增量的滚动

posted @ 2016-11-06 08:19  Seanisme  阅读(457)  评论(0)    收藏  举报