------------layer1---------------
-------layer2--------
--layer3-----
normal:
E/layer1 (31198): dispatchTouchEvent ACTION_DOWNE/layer1 (31198): onInterceptTouchEvent ACTION_DOWN
E/layer2 (31198): dispatchTouchEvent ACTION_DOWN
E/layer2 (31198): onInterceptTouchEvent ACTION_DOWN
E/layer3 (31198): dispatchTouchEvent ACTION_DOWN
E/layer3 (31198): onInterceptTouchEvent ACTION_DOWN
E/layer3 (31198): onTouchEvent ACTION_DOWN
E/layer2 (31198): onTouchEvent ACTION_DOWN
E/layer1 (31198): onTouchEvent ACTION_DOWN
layer3 onTouchEvent return true:
E/layer1 ( 1370): dispatchTouchEvent ACTION_DOWN
E/layer1 ( 1370): onInterceptTouchEvent ACTION_DOWN
E/layer2 ( 1370): dispatchTouchEvent ACTION_DOWN
E/layer2 ( 1370): onInterceptTouchEvent ACTION_DOWN
E/layer3 ( 1370): dispatchTouchEvent ACTION_DOWN
E/layer3 ( 1370): onInterceptTouchEvent ACTION_DOWN
E/layer3 ( 1370): onTouchEvent ACTION_DOWN
E/layer1 ( 1370): dispatchTouchEvent ACTION_MOVE
E/layer1 ( 1370): onInterceptTouchEvent ACTION_MOVE
E/layer2 ( 1370): dispatchTouchEvent ACTION_MOVE
E/layer2 ( 1370): onInterceptTouchEvent ACTION_MOVE
E/layer3 ( 1370): dispatchTouchEvent ACTION_MOVE
E/layer3 ( 1370): onTouchEvent ACTION_MOVE
E/layer1 ( 1370): dispatchTouchEvent ACTION_UP
E/layer1 ( 1370): onInterceptTouchEvent ACTION_UP
E/layer2 ( 1370): dispatchTouchEvent ACTION_UP
E/layer2 ( 1370): onInterceptTouchEvent ACTION_UP
E/layer3 ( 1370): dispatchTouchEvent ACTION_UP
E/layer3 ( 1370): onTouchEvent ACTION_UP
layer2 onInterceptTouchEvent return true:
E/layer1 ( 2776): dispatchTouchEvent ACTION_DOWN
E/layer1 ( 2776): onInterceptTouchEvent ACTION_DOWN
E/layer2 ( 2776): dispatchTouchEvent ACTION_DOWN
E/layer2 ( 2776): onInterceptTouchEvent ACTION_DOWN
E/layer2 ( 2776): onTouchEvent ACTION_DOWN
E/layer1 ( 2776): onTouchEvent ACTION_DOWN
layer2 onInterceptTouchEvent return true + onTouchEvent return true:
E/layer1 ( 3409): dispatchTouchEvent ACTION_DOWN
E/layer1 ( 3409): onInterceptTouchEvent ACTION_DOWN
E/layer2 ( 3409): dispatchTouchEvent ACTION_DOWN
E/layer2 ( 3409): onInterceptTouchEvent ACTION_DOWN
E/layer2 ( 3409): onTouchEvent ACTION_DOWN
E/layer1 ( 3409): dispatchTouchEvent ACTION_MOVE
E/layer1 ( 3409): onInterceptTouchEvent ACTION_MOVE
E/layer2 ( 3409): dispatchTouchEvent ACTION_MOVE
E/layer2 ( 3409): onTouchEvent ACTION_MOVE
E/layer1 ( 3409): dispatchTouchEvent ACTION_UP
E/layer1 ( 3409): onInterceptTouchEvent ACTION_UP
E/layer2 ( 3409): dispatchTouchEvent ACTION_UP
E/layer2 ( 3409): onTouchEvent ACTION_UP
layer1 onTouchEvent return true:
E/layer1 ( 4826): dispatchTouchEvent ACTION_DOWN
E/layer1 ( 4826): onInterceptTouchEvent ACTION_DOWN
E/layer2 ( 4826): dispatchTouchEvent ACTION_DOWN
E/layer2 ( 4826): onInterceptTouchEvent ACTION_DOWN
E/layer3 ( 4826): dispatchTouchEvent ACTION_DOWN
E/layer3 ( 4826): onInterceptTouchEvent ACTION_DOWN
E/layer3 ( 4826): onTouchEvent ACTION_DOWN
E/layer2 ( 4826): onTouchEvent ACTION_DOWN
E/layer1 ( 4826): onTouchEvent ACTION_DOWN
E/layer1 ( 4826): dispatchTouchEvent ACTION_MOVE
E/layer1 ( 4826): onTouchEvent ACTION_MOVE
E/layer1 ( 4826): dispatchTouchEvent ACTION_UP
E/layer1 ( 4826): onTouchEvent ACTION_UP
layer1 onTouchEvent return true + onInterceptTouchEvent return true:
E/layer1 ( 6547): dispatchTouchEvent ACTION_DOWN
E/layer1 ( 6547): onInterceptTouchEvent ACTION_DOWN
E/layer1 ( 6547): onTouchEvent ACTION_DOWN
E/layer1 ( 6547): dispatchTouchEvent ACTION_MOVE
E/layer1 ( 6547): onTouchEvent ACTION_MOVE
E/layer1 ( 6547): dispatchTouchEvent ACTION_UP
E/layer1 ( 6547): onTouchEvent ACTION_UP
GestureDetector 的 SimpleOnGestureListener 触发事件log:
点一下松开
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onDown
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onSingleTapUp
按住不放:
E/TouchView( 7169): onDown
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
.......................................................
慢滑:
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onDown
E/TouchView( 7169): onTouchEvent
......................................................
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onScroll 10.298798 16.61319
快滑:
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onDown
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onScroll 21.969482 13.989075
E/TouchView( 7169): onTouchEvent
E/TouchView( 7169): onFling -1358.3735 -843.7525
onFling 前面一定会伴随这一次的onDown 和 几次的 onScroll
/**
* Implement this method to intercept all touch screen motion events. This
* allows you to watch events as they are dispatched to your children, and
* take ownership of the current gesture at any point.
*
* <p>Using this function takes some care, as it has a fairly complicated
* interaction with {@link View#onTouchEvent(MotionEvent)
* View.onTouchEvent(MotionEvent)}, and using it requires implementing
* that method as well as this one in the correct way. Events will be
* received in the following order:
*
* <ol>
* <li> You will receive the down event here.
* <li> The down event will be handled either by a child of this view
* group, or given to your own onTouchEvent() method to handle; this means
* you should implement onTouchEvent() to return true, so you will
* continue to see the rest of the gesture (instead of looking for
* a parent view to handle it). Also, by returning true from
* onTouchEvent(), you will not receive any following
* events in onInterceptTouchEvent() and all touch processing must
* happen in onTouchEvent() like normal.
* <li> For as long as you return false from this function, each following
* event (up to and including the final up) will be delivered first here
* and then to the target's onTouchEvent().
* <li> If you return true from here, you will not receive any
* following events: the target view will receive the same event but
* with the action {@link MotionEvent#ACTION_CANCEL}, and all further
* events will be delivered to your onTouchEvent() method and no longer
* appear here.
* </ol>
*
* @param ev The motion event being dispatched down the hierarchy.
* @return Return true to steal motion events from the children and have
* them dispatched to this ViewGroup through onTouchEvent().
* The current target will receive an ACTION_CANCEL event, and no further
* messages will be delivered here.
*/
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
注释的内容还是挺重要的,试了一下,
一个LinearLayout里面套了一个View:
<1>LinearLayout 的 onInterceptTouchEvent 和 onTouchEvent 都 return false, View 的onTouchEvent return false:
E/FYF ( 6165): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF ( 6165): myView ACTION_DOWN
E/FYF ( 6165): myLinearLayout ACTION_DOWN
E/FYF ( 6165): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF ( 6165): myView ACTION_DOWN
E/FYF ( 6165): myLinearLayout ACTION_DOWN
因为在第一次来了一个ACTION_DOWN,被LinearLayout的onInterceptTouchEvent放行到了View, 而View的onTouchEvent return false, 就重新上交给 LinearLayout处理,
但是因为LinearLayout的onTouchEvent也返回了false,因此按照规定,后面的所有ACTION_MOVE/UP 都会再传递到LinearLayout了.
<2>LinearLayout 的 onInterceptTouchEvent return false. onTouchEvent return true/false(在View 的onTouchEvent return true的情况下,true/false没有影响), View 的onTouchEvent return true:
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF ( 6792): myView ACTION_DOWN
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_MOVE
E/FYF ( 6792): myView ACTION_MOVE
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_MOVE
E/FYF ( 6792): myView ACTION_MOVE
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_MOVE
E/FYF ( 6792): myView ACTION_MOVE
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_MOVE
E/FYF ( 6792): myView ACTION_MOVE
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_MOVE
E/FYF ( 6792): myView ACTION_MOVE
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_MOVE
E/FYF ( 6792): myView ACTION_MOVE
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_MOVE
E/FYF ( 6792): myView ACTION_MOVE
E/FYF ( 6792): myLinearLayout onInterceptTouchEvent ACTION_UP
E/FYF ( 6792): myView ACTION_UP
因为LinearLayout的onInterceptTouchEvent一直在放行,因此所有的ACTION都可以被传递给View, 而View的onTouchEvent返回true,因此可以处理后续的ACTION,就不会接收了ACTION_DOWN以后就什么就没有了, 而因为onInterceptTouchEvent一直在放行(return false), 因此可以一直截获所有的ACTION.
<3>LinearLayout 的 onInterceptTouchEvent return false, onTouchEvent return true, View 的onTouchEvent return false:
E/FYF ( 7465): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF ( 7465): SystemUtils is loaded 1 7465
E/FYF ( 7465): myView ACTION_DOWN
E/FYF ( 7465): myLinearLayout ACTION_DOWN
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_MOVE
E/FYF ( 7465): myLinearLayout ACTION_UP
依照注释所讲:
The down event will be handled either by a child of this view
* group, or given to your own onTouchEvent() method to handle; this means
* you should implement onTouchEvent() to return true, so you will
* continue to see the rest of the gesture (instead of looking for
* a parent view to handle it). Also, by returning true from
* onTouchEvent(), you will not receive any following
* events in onInterceptTouchEvent() and all touch processing must
* happen in onTouchEvent() like normal.
如果LInearLayout自己的onTouchEvent返回了true,并且event没有被自己的子View所处理,那么代表着LinearLayout将会处理此次动作, 那么ACTION_DOWN后面的Action就不会被在onInterceptTouchEvent中截获了,而是直接传递给了LinearLayout的onTouchEvent.
<4> LinearLayout 的 onInterceptTouchEvent 和 onTouchEvent 都 return true, View 的onTouchEvent return true/false(因为event之前都被拦截了,所以传不到View, true/false都一样):
E/FYF ( 8406): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF ( 8406): SystemUtils is loaded 1 8406
E/FYF ( 8406): myLinearLayout ACTION_DOWN
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_MOVE
E/FYF ( 8406): myLinearLayout ACTION_UP
按照注释所说:
* If you return true from here, you will not receive any
* following events: the target view will receive the same event but
* with the action {@link MotionEvent#ACTION_CANCEL}, and all further
* events will be delivered to your onTouchEvent() method and no longer
* appear here.
因为LinearLayout 的 onInterceptTouchEvent返回了true, 不会再收到后面的ACTION,ACTION都直接传递给了自己的onTouchEvent,而因为自己的onTouchEvent返回了true,因此可以一直接收处理后面的ACTION.
<4> LinearLayout 的 onInterceptTouchEvent return true, onTouchEvent return false, View 的onTouchEvent return true/false(因为event之前都被拦截了,所以传不到View, true/false都一样):
E/FYF ( 9198): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF ( 9198): myLinearLayout ACTION_DOWN
虽然LinearLayout 的 onInterceptTouchEvent返回了true, 将所有的ACTION都给了自己处理,但是到了onTouchEvent那里又反悔了不处理,这样后面的ACTION就不会再来了.
<5>
LinearLayout 的 onInterceptTouchEvent 在ACTION_DOWN return false,其他情况 return true,
LinearLayout 的onTouchEvent return true/false,
View 的onTouchEvent return true,在收到ACTION_DOWN时调用LinearLayout的requestDisallowInterceptTouchEvent(true):
E/FYF (11854): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF (11854): myView ACTION_DOWN
E/FYF (11854): myView ACTION_MOVE
E/FYF (11854): myView ACTION_MOVE
E/FYF (11854): myView ACTION_MOVE
E/FYF (11854): myView ACTION_MOVE
E/FYF (11854): myView ACTION_MOVE
E/FYF (11854): myView ACTION_UP
可以看到,在requestDisallowInterceptTouchEvent(true)以后,所有的ACTION都不会经过LinearLayout的onInterceptTouchEvent了
<6>
LinearLayout 的 onInterceptTouchEvent 在ACTION_DOWN return false,其他情况 return true,
LinearLayout 的onTouchEvent return true,
View 的onTouchEvent return false,在收到ACTION_DOWN时调用LinearLayout的requestDisallowInterceptTouchEvent(true):
E/FYF (12269): myLinearLayout onInterceptTouchEvent ACTION_DOWN
E/FYF (12269): myView ACTION_DOWN
E/FYF (12269): myLinearLayout ACTION_DOWN
E/FYF (12269): myLinearLayout ACTION_MOVE
E/FYF (12269): myLinearLayout ACTION_MOVE
E/FYF (12269): myLinearLayout ACTION_MOVE
E/FYF (12269): myLinearLayout ACTION_UP
和上面的对比,虽然View禁止了LinearLayout的Intercept,但是自己返回false也没处理ACTION, 因此就交由了LinearLayout处理了,不过因为禁止了Intercept,所以没有再出现onInterceptTouchEvent。
有一点奇怪的是分别试了在View的onAttachToWindow/LinearLayout的onTouchEvent调用requestDisallowInterceptTouchEvent(true) 貌似不管用,mark一下.TODO