android touch scroll fling event 测试

来源:互联网 发布:程序员需要学英语吗 编辑:程序博客网 时间:2024/06/06 02:30

------------layer1---------------

       -------layer2--------

             --layer3-----


normal:

E/layer1  (31198): dispatchTouchEvent ACTION_DOWN
E/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

0 0
原创粉丝点击