-------------------------------------------------view.ontouch
当view.ontouch返回false时,
后续事件(move和up事件)将不再被传递进来(view对后续事件不感兴趣)。事件(如:down) 将传递给帮手(如:father.ontouch)
注意:若ontouch在消费了 某一个后续事件(如:move)后,又返回false,则,后续事件 将继续被传递进来(忽略 false(不感兴趣))
当view.ontouch返回true时,
后续事件(move和up事件)将被传递进来(view对后续事件感兴趣)。事件(如:down) 将不传递给帮手
-------------------------------------------------father.onintercept, father.ontouch, child.ontouch
当father.onintercept返回false时,
拦截后放行,拦截的事件(如:down) 将传递给 child.ontouch
注意:是的,拦截的事件是一定会传给child.ontouch,但是,你要检验一下,该事件的type。例子1:你为 listview的itemview 设置ontouchlistener。当你在上下滑动listview的时候,恭喜你,你的itemview的ontouch被调用,恩,down事件已经被传递进来了,恩,若干的move事件被传递进来了,但是,你看到:cancel事件被传递进来。随后,listview.ontouch接管了后续的事件(无论,其返回的是true还是false,为什么:参见:当view.ontouch返回false时)(这也是为什么:你看到了list在上下滚动,而itemview被通知:你看上去消耗完了所有的事件)
又怎么样:当你要为 左右滑动itemview 来设置 特殊的响应(如:删除一个item,或者,构造缩进效果),你将会特别的在意:事件到底该如何传递,而又到哪里被消耗完毕,错误的传递将使 整个设计效果 奇形怪状。
例子2:设:father是listview,当前的事件是move,事件传给了father.onintercept。在它返回false之前,你adapter.notifiydatasetchanged,那么,恭喜你,事件将被传递给itemview.ontouch,但是类型是cancel
如果child.ontouch返回false,
后续事件(move和up事件) 将不再传递给 father.onintercept(因为:child已经对后续事件不感兴趣,则,不用再考虑 拦截放行)
如果child.ontouch返回true,
后续事件 将传递给 father.onintercept(因为:child对后续事件感兴趣,仍然要考虑 拦截放行)
当father.onintercept返回true时,
拦截后不放行,拦截的事件 将传递给帮手(father.ontouch)。若事件
类型为down,则不传递给child.ontouch
类型为move,则传递给child.ontouch,且,类型变为cancel
后续事件 将不再传递给 father.onintercept(因为:child无法对后续事件感兴趣,则,不用再考虑 拦截放行)
-------------------------------------------------motionevent
值得说的,如下:
1. getX vs getRawX(同理,对于Y)
getX:touch点 相对于 自身view的父view的 x坐标
getRawX:touch点 相对于 屏幕左顶点的 x坐标
2. getX(同理,对于Y)
getX得到的x坐标,永远都是针对于 自身view的父view(恩,我们又强调了一遍)
也即是:father.onintercepttouchevent(motionevent ev)中,ev.getX得到的是:针对于 father的父view 的x值
3. motionevent可靠吗什么?:是的,的确拦截了child的motionevent,但是,参数可是传递到father的方法中(onintercepttouchevent)
同理,如果child.ontouchevent返回false,motionevent会再被传递到father.ontouchevent,是的,ev.getX得到的是:针对于 father的父view 的x值
你如果syso一个motionevent,那么将展示它的所有参数
恩,还很体贴,但是,它为什么不是这样:MotionEvent@xxxxxxxx:你可以充分怀疑:运行时的motionevent,永远都只有一个
你可以做实验,将一个motionevent保存,然后,再打印,看看它的参数,还和之前的一样吗?恩,做了实验,一样,那么,handler.postrunnable(syso(motionevent))呢(请确保,你在使用主线程上的handler的队列)?:结果肯定会让你傻眼:x,y的值 实际上是 rawx, rawy。什么?为什么会是这样?:你可以怀疑,除了child/father外,系统在某个地方还在处理motionevent,而motionevent在那个地方 被改变了
so,又怎么样:让我们回想一下:motionevent被怀疑 只有一个对象,且它时时刻刻都在被改变,那么,请不要在你的程序的某个地方保存motionevent,并在某个时刻,调用getX来获得数值
so...:没有了
本文详细解析了Android中触摸事件的传递机制,包括view.ontouch、father.onintercept及motionevent的工作原理,阐述了不同返回值对后续事件的影响。
1135

被折叠的 条评论
为什么被折叠?



