`
becherpan
  • 浏览: 5821 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

有关ViewGroup的onInterceptTouchEvent的事件传递

 
阅读更多
 
ViewGroup的onInterceptTouchEvent 顾名思义,作用是拦截TouchEvent。
假如有以下布局
在一组TouchEvent中可能出现:
没有View或ViewGroup消费ACTION_DOWN事件,则TouchEvent的传递路径会是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ChildView.onTouchEvent —> ViewGroup2.onTouchEvent —> ViewGroup1.onTouchEvent 
由于谁都没有消费ACTION_DOWN事件,后续的MOVE,UP事件将不会传进来。
 
ViewGroup2拦截且消费了ACTION_DOWN事件,则TouchEvent的传递路径会是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —>  ViewGroup2.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
也即后续的TouchEvent都传递给了ViewGroup2。
 
ViewGroup2拦截了ACTION_DOWN事件但不消费,而ViewGroup1消费了该TouchEvent,则TouchEvent的传递路径会是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —>  ViewGroup2.onTouchEvent —> ViewGroup1.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onTouchEvent ; 
也即后续的TouchEvent都传递给了ViewGroup1。
 
ChildView先消费了ACTION_DOWN事件,然后满足一定条件时ViewGroup2拦截了TouchEvent,此时无论ViewGroup2是否消费该TouchEvent,TouchEvent的传递路径是:
ACTION_DOWN : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ChildView.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent —> ChildView.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onInterceptTouchEvent  && ACTION_CANCEL : ChildView.onTouchEvent ;  (满足条件触发ViewGroup2拦截,会传递ACTION_CANCEL给ChildView)
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
ACTION_MOVE : ViewGroup1.onInterceptTouchEvent —> ViewGroup2.onTouchEvent ;
也即后续的TouchEvent都传递给了ViewGroup2的onTouchEvent,且无论ViewGroup2是否消费该TouchEvent 。
 
 
  • 描述: layout
  • 大小: 10.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics