一、资源:
MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序
ANDROID事件触发机制,针对于由于触摸(Touch)而触发的事件。
二、重点
- 首先要明确onInterceptTouchEvent()这个方法只针对于ViewGroup,事件传到ViewGroup一般先触发onInterceptTouchEvent(),View是没有这个方法的
- 具体传递的流程见资源1,很详细,对理解很有帮助
- onInterceptTouchEvent()改变事件传递的方向
- false->下一个对象
- true->本对象
- onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。
- false->继续下一步处理
- true->已经消费,不继续处理
三、问题思考
1、是不是无论哪种情况下,最后一个发生的onTouchEvent()的返回值均为true?
我做了试验,onTouchEvent()和onTouchEvent()均返回false情况,一个滑动手势只捕捉到了ACTION_DOWN
所以我认为android应该是有个机制,让顶部有效的onTouchEvent自定返回true,按照资源1的描述看来,此后的时间信息都直接传给了最顶部的有效onTouchEvent()处理了。
若顶部有效的onTouchEvent自定返回false的话,那么开始的信息得不到消费,比如Action_DOWN,那后面的动作也没办法触发啊!
2、我感觉onInterceptTouchEvent()其实只能处理Action_DOWN,因为我觉得问题1正确的话,此后的Action_UP,Action_MOVE都会被最后一个有用的onTouchEvent截取?
理由同问题描述,信息最后都汇总到返回true的onTouchEvent哪里,onInterceptTouchEvent()根本没有机会啊。
但是在一些程序中,我确实看到了onInterceptTouchEvent()截取了ACTION_MOVE,ACTION_UP等操作,如何实现的,不解!!
“我研究了下。 需要往 screen 加 onclick事件,才能两个屏幕这样切换。 没弄懂onInterceptTouchEvent。 为什么要加 onclick呢,因为如果不加,那么 onInterceptTouchEvent return false 也是直接执行 onTouchEvent 而不是继续执行 onInterceptTouchEvent 如果加了onclick,那么 onInterceptTouchEvent return false 会直接执行 onInterceptTouchEvent。 求解答。”
首先得明确onInterceptTouchEvent()是ViewGroup的方法,不是View的方法!
前半句好理解:设当前ViewGroup称为Parent,点击的子View为Child,
所以就算 onInterceptTouchEvent return false它也只能触发Child和Parent的onTouchEvent, 你那个时候Parent.onTouchEvent返回的应该也是true,此后的动作都直接传到Parent.onTouchEvent后半句无法理解,onclick在onTouchEvent中的ACTION_UP实现(参见下一篇),如果问题1的成立,那么后面的ACTION_MOVE,ACTION_UP都传不到非顶层的函数,所以说问题1是症结所在!!