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)
    scrollBy(x, y) = scrollTo(mScrollX + x, mScrollY + y);
    增量的滚动

    原文作者:沉默的范大叔
    原文地址: https://www.jianshu.com/p/b0cc87e0a87d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞