Touch事件传递
事件序列:ACTION_DOWN, ACTION_MOVE, ACTION_UP
Touch事件传递涉及到的方法:
- dispatchTouchEvent(分发事件)
- onInterceptTouchEvent(拦截事件)
- onTouchEvent(处理触摸事件)
Touch事件的传递过程:
- 父容器拿到事件,不拦截,事件就分发给孩子,如果孩子不消费事件,事件又传递给父容器,看父容器是否消费(onTouchEvent)
- 如果ACTION_DOWN事件没有view消费,那么后续的事件ACTION_MOVE,ACTION_UP就不会传递进来
- 父容器拿到事件,不拦截,事件就分发给孩子,如果孩子消费事件,事件传递结束
- 父容器拿到事件,拦截,事件就不会分发给孩子,交给自己处理(onTouchEvent)
- 如果点击的位置没有孩子,事件也不会传递给孩子
Activity与事件传递
- Activity获取事件,调用dispatchTouchEvent分发给PhoneWindow
- PhoneWindow的DecorView将事件分发给所有的view
- 没有任何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);
增量的滚动