1.Touch传递机制:
当目标view收到Down并且touch事件执行完毕后返回false时(不同于在ontouch和case Action.down时直接返回false,因为touch事件包括touchlistener和touchevent见后面说明),后续的move和up将不再传递到本view
参考文章:http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html
http://blog.csdn.net/ddna/article/details/5473293
2.Touch与click和longclick的关系:
测试截图:
1)ontouch return false的情形,即down false,up false
2)down true,up false的情形
3)down false up true的情形
plus)这是通过现象总结出的,进阶版解释启发于http://blog.csdn.net/jiangwei0910410003/article/details/17504315这篇文章,先上图
说明:“在View中的dispatchTouchEvent方法中可以看到,是先执行OnTouchListener监听器中的onTouch方法,如果onTouchListener不为null,并且onTouch方法返回false的时候才执行onTouchEvent方法"
”从上面的例子可以看出来:onClick方法的执行时依赖于onTouch方法的,下面就总结一下onClick和onTouch两个方法之间的执行关系:
如果该View 是disable 状态:那么给它加上pressed标志位,重绘一下(在屏幕上显示为灰显按下去的效果)
如果该View不是disable状态,并且是clickable,那么在ACTION_DOWN的时候会加上pressed标志位,并启动一个timer(长按事件onLongClickListener)。重绘一下(显示出按下去的效果)。此时还是MOVE事件监视该View的状态,如果这个MOVE滑出了该View的范围,那么会复位View的click状态。UP事件时,会检查是否已经执行过LongPress,如果已经执行了LongPress,那么就不执行了Click,反之,会取消掉LongPress的Timer,然后在执行Click。
在UP事件的最后,做一下收尾处理,完事。
所以TouchEvent是Click 和 LongPress的底层实现,View的派生类如Button等等就不需要重写OnTouchEvent。“
"如果这个控件是可以点击的,那么onTouchEvent方法就返回true"
遗留的问题是:longclick和up事件似乎是互不相干的无法确定执行顺序,看图down false up true的情形,依此理论还是无法解释,请求看到文章的高手指教
3.涉及到手势操作时,将cancel与up当做同一事件处理
这篇文章的做法,很厉害http://yzhong-sa.iteye.com/blog/648807