我准备总结dispatchTouchEvent onUserInteraction onTouchEvent onInterceptTouchEvent四个回调在activity,layout,viewgroup,view四个层次的调用顺序。首先定义消息的传递方向,第一个接受消息的为最顶端的话,四个层次从顶端到底端就是我列出的顺序(网上很多江湖郎中扯什么消息是从最里面的控件传到最外面,那是片面之词),但是每个层次不一定都有这四个回调,在我实验结果中,消息的传递并不是单向的,而是环形的。
不需要复杂的示意图,也不需要晦涩的术语。假设屏幕上是一个布局,布局里有一个按钮,对,就这么多东西。然后用户手指在按钮上按了一下,这时候Activity会在dispatchTouchEvent中收到一个down事件,Activity可以选择自己尝试消费(dispatch里return true),尝试消费的话就会在onTouch中收到这个消息,onTouch返回真表示消费成功,这个事件就结束了(否则会传给上级消费);也可以不尝试消费而给自己的下一级——布局。布局会在onInterceptTouchEvent中收到这个消息,但是布局并没有dispatch这个函数,布局的“dispatch”函数名字叫onInterceptTouchEvent,同样表示是否尝试消费,准确来讲是表示是否阻断,一旦阻断了,这个消息就无法下达了。对于下面的viewgroup和view都是一样的道理,一般如果一个容器表示要消费,消息就不一定会传下去,如果容器消费成功了事件就完成了,否则就给里面的容器。里面的容器没有消费的话仍然会返回给上面的容器消费。
我写得可能很糟糕,
一个很好的例子在:http://orgcent.com/android-touch-event-mechanism/
一个很好的讲解在:http://www.cnblogs.com/playing/archive/2011/06/16/2082564.html
至于手势处理,不必放到layout层和viewgroup层,就activity层就能处理了。