touch (a bit more)

-------------------------------------------------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值

什么?:是的,的确拦截了child的motionevent,但是,参数可是传递到father的方法中(onintercepttouchevent)

同理,如果child.ontouchevent返回false,motionevent会再被传递到father.ontouchevent,是的,ev.getX得到的是:针对于 father的父view 的x值

3. motionevent可靠吗

你如果syso一个motionevent,那么将展示它的所有参数

恩,还很体贴,但是,它为什么不是这样:MotionEvent@xxxxxxxx:你可以充分怀疑:运行时的motionevent,永远都只有一个

你可以做实验,将一个motionevent保存,然后,再打印,看看它的参数,还和之前的一样吗?恩,做了实验,一样,那么,handler.postrunnable(syso(motionevent))呢(请确保,你在使用主线程上的handler的队列)?:结果肯定会让你傻眼:x,y的值 实际上是 rawx, rawy。什么?为什么会是这样?:你可以怀疑,除了child/father外,系统在某个地方还在处理motionevent,而motionevent在那个地方 被改变了

so,又怎么样:让我们回想一下:motionevent被怀疑 只有一个对象,且它时时刻刻都在被改变,那么,请不要在你的程序的某个地方保存motionevent,并在某个时刻,调用getX来获得数值

so...:没有了




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值