2019独角兽企业重金招聘Python工程师标准>>>
在ViewGroup里覆写了onInterceptTouchEvent()方法,就可以对各种touch事件加以拦截。但是touch事件在onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。
down事件首先会传递到onInterceptTouchEvent()方法。该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后:
(1)return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
(2)return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
实验:
onInterceptTouchEvent()处理down事件均返回false,onTouchEvent处理事件均返回true:
LayoutView1 : onInterceptTouchEvent action : ACTION_DOWN
LayoutView2 : onInterceptTouchEvent action : ACTION_DOWN
MyTextView : onTouchEvent action : ACTION_DOWN
LayoutView1 : onInterceptTouchEvent action : ACTION_MOVE
LayoutView2 : onInterceptTouchEvent action : ACTION_MOVE
MyTextView : onTouchEvent action : ACTION_MOVE
这是最常见的情况,onInterceptTouchEvent并没有做任何改变事件传递时序的操作,效果上和没有重写该方法一样。各种事件的传递本身是自底向上的,次序:LayoutView1 -> LayoutView2 -> MyTextView. 在onInterceptTouchEvent均返回false时,LayoutView1 和 LayoutView2 的onTouchEvent并不会接收到事件,而是最终传递给了MyTextView.
LayoutView1 的onInterceptTouchEvent处理down事件返回true,MyTextView的onTouchEvent事件返回true:
LayoutView1 : onInterceptTouchEvent action : ACTION_DOWN
LayoutView1 : onTouchEvent action : ACTION_DOWN
LayoutView1 : onTouchEvent action : ACTION_MOVE
LayoutView1 : onTouchEvent action : ACTION_MOVE
LayoutView1 : onTouchEvent action : ACTION_UP
LayoutView1在拦截第一次down事件时return true,所以后续事件(包括第一次的down)将由LayoutView1本身处理,事件不再传递下去。
LayoutView1,LayoutView2的onInterceptTouchEvent处理down事件返回false,MyTextView的onTouchEvent事件返回false,LayoutView2的onTouchEvent事件返回true
LayoutView1 : onInterceptTouchEvent action : ACTION_DOWN
LayoutView2 : onInterceptTouchEvent action : ACTION_DOWN
MyTextView : onTouchEvent action : ACTION_DOWN
LayoutView2 : onTouchEvent action : ACTION_DOWN
LayoutView1 : onInterceptTouchEvent action : ACTION_MOVE
LayoutView2 : onTouchEvent action : ACTION_MOVE
LayoutView1 : onInterceptTouchEvent action : ACTION_MOVE
LayoutView2 : onTouchEvent action : ACTION_MOVE