android touch scroll fling event 测试
来源:互联网 发布:程序员需要学英语吗 编辑:程序博客网 时间:2024/06/06 02:30
------------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
- android touch scroll fling event 测试
- Android: 触屏fling/scroll/drag的区别及其详细过程
- android touch event summary
- Android Touch Event 超出范围
- fling
- fling
- Fling!
- Android中的Touch event处理方式
- Monitor Screen Touch Event in Android
- 触屏fling/scroll/drag的区别及其详细过程
- 天天记录 - Android Touch Event接收并传递给Activity
- Android学习----响应被父控件拦截的touch event
- Android & IPhone Fling 游戏求解算法
- Android Scroll
- Android Scroll
- Android Scroll
- Capture UITableView Touch Event
- Sencha touch titleBar event
- scoket网络通信收发消息
- NumberUtils、ArrayUtils和RandomUtils工具类用法
- 网络字节流和主机字节流
- domino POP/SMTP问题处理以及性能优化
- HDU 1043 Eight
- android touch scroll fling event 测试
- 源码编译,添加三方jar包的方法
- C#不规则窗体
- JQueryEasyUI学习笔记(十)datagrid 添加、修改、删除
- 解决jar包冲突的问题
- 【LeetCode】Binary Tree Level Order Traversal II
- JS:checkbox 全选及传值相关
- pc 端区间滑块
- 19.Swift-类型嵌套