要彻底理解ontouch事件,首先必须从源码角度对ontouch事件有个直观的认识,谈到认识,不得不提及一位大牛的两篇博文,实际上如果看懂了,ontouch事件和onclick包括onlongclick基本上也就被攻克了。
http://blog.csdn.net/guolin_blog/article/details/9097463
http://blog.csdn.net/guolin_blog/article/details/9153747
本人只是站在巨人的肩膀上,看明白以后,发布一下自己的测试报告和结论。
在展示测试报告之前,先来温习一下ontouch事件的传递流程,点击在这个布局的child上以后,肯定是先调用parent(viewgroup)的dispatchontouchevent分发事件,在dispatchontouchevent中会有一个interceptontouchevent判断parent是否拦截ontouch事件,如果拦截,则ontouch事件在parent组件进行处理,如果不拦截,那么ontouch事件会分发给被点击的child,此时执行child的actiondown事件,如果执行完actiondown返回false,那么ontouch事件会上溯给parent的ontouch方法进行处理,接着parent一样会执行actiondown事件,执行完返回false那么后续事件就没有得处理了,如果返回true,则执行action move和up。
by the way,如果上图你没看懂,请继续看前文的两个超链接直到看透为止。
后记:onlongclick的判断是在action down中判断的,如果一个button既绑定了点击事件,又绑定了长按事件,那么长按事件最好返回true,否则长按以后会继续走action up松开手时候还会相应click事件,除非你需要两者的效果同时出现。