Android touch 事件传递有三个方法
默认情况log
//默认
01-26 16:17:42.515: D/touchview(1407):out::::dispatchTouchEvent
01-26 16:17:42.515: D/touchview(1407):out::::onInterceptTouchEvent
01-26 16:17:42.515: D/touchview(1407):mid::::dispatchTouchEvent
01-26 16:17:42.515: D/touchview(1407):mid::::onInterceptTouchEvent
01-26 16:17:42.515: D/touchview(1407):in::::dispatchTouchEvent
01-26 16:17:42.515: D/touchview(1407):in::::onInterceptTouchEvent
01-26 16:17:42.515: D/touchview(1407):in::::onTouchEvent
01-26 16:17:42.515: D/touchview(1407):mid::::onTouchEvent
01-26 16:17:42.515: D/touchview(1407):out::::onTouchEvent
设置out dispatchTouchEvent 返回true
//out dispatch is true
01-26 16:19:42.725: D/touchview(1949):out::::dispatchTouchEvent
01-26 16:19:46.225: D/touchview(1949):out::::dispatchTouchEvent
01-26 16:19:55.386: D/touchview(1949):out::::dispatchTouchEvent
设置out dispatchTouchEvent 返回false
//out dispatch is false
01-26 16:20:53.555: D/touchview(2192):out::::dispatchTouchEvent
结论 必须调用super.dispatchTouchEvent(ev);否则后面的两个方法无法触发,所以发现这个方法根本没有必要重写,因为框架是在 super.dispatchTouchEvent(ev)中来调用onInterceptTouchEvent和onTouchEvent方法的,所以手动的设置dispatchTouchEvent的返回值是无效的,除非你不想让框架触发这两个方法。
设置out onInterceptTouchEvent返回true
01-26 17:12:41.978: D/touchview(6075):out::::dispatchTouchEvent
01-26 17:12:41.978: D/touchview(6075):out::::onInterceptTouchEvent
01-26 17:12:41.988: D/touchview(6075):out::::onTouchEvent
Event进入out的touchevent中 子view的事件都打酱油了
设置out onInterceptTouchEvent 返回false
01-26 17:24:53.708: D/touchview(7092):out::::dispatchTouchEvent
01-26 17:24:53.708: D/touchview(7092):out::::onInterceptTouchEvent
01-26 17:24:53.708: D/touchview(7092):mid::::dispatchTouchEvent
01-26 17:24:53.708: D/touchview(7092):mid::::onInterceptTouchEvent
01-26 17:24:53.708: D/touchview(7092):in::::dispatchTouchEvent
01-26 17:24:53.708: D/touchview(7092):in::::onInterceptTouchEvent
01-26 17:24:53.708: D/touchview(7092):in::::onTouchEvent
01-26 17:24:53.708: D/touchview(7092):mid::::onTouchEvent
01-26 17:24:53.708: D/touchview(7092):out::::onTouchEvent
目测是默认情况一样把最里面的view in onInterceptTouchEvent 返回false
01-26 17:26:52.738: D/touchview(10328):out::::dispatchTouchEvent
01-26 17:26:52.738: D/touchview(10328):out::::onInterceptTouchEvent
01-26 17:26:52.738: D/touchview(10328):mid::::dispatchTouchEvent
01-26 17:26:52.738: D/touchview(10328):mid::::onInterceptTouchEvent
01-26 17:26:52.738: D/touchview(10328):in::::dispatchTouchEvent
01-26 17:26:52.738: D/touchview(10328):in::::onInterceptTouchEvent
01-26 17:26:52.738: D/touchview(10328):in::::onTouchEvent
01-26 17:26:52.738: D/touchview(10328):mid::::onTouchEvent
01-26 17:26:52.738: D/touchview(10328):out::::onTouchEvent
onInterceptTouchEvent 返回true 事件给自己的onTouchEvent处理,返回false就想自己的子view传递,如果没有子view的话,根据log来看,不管怎样都传给了onTouchEvent(例子里面的布局in)
设置mid onTouchEvent 返回true
01-26 17:39:53.778: D/touchview(11302):out::::dispatchTouchEvent
01-26 17:39:53.778: D/touchview(11302):out::::onInterceptTouchEvent
01-26 17:39:53.778: D/touchview(11302):mid::::dispatchTouchEvent
01-26 17:39:53.778: D/touchview(11302):mid::::onInterceptTouchEvent
01-26 17:39:53.778: D/touchview(11302):in::::dispatchTouchEvent
01-26 17:39:53.778: D/touchview(11302):in::::onInterceptTouchEvent
01-26 17:39:53.778: D/touchview(11302):in::::onTouchEvent
01-26 17:39:53.778: D/touchview(11302):mid::::onTouchEvent
01-26 17:39:53.788: D/touchview(11302):out::::dispatchTouchEvent
01-26 17:39:53.788: D/touchview(11302):out::::onInterceptTouchEvent
01-26 17:39:53.788: D/touchview(11302):mid::::dispatchTouchEvent
01-26 17:39:53.788: D/touchview(11302):mid::::onTouchEvent
01-26 17:39:53.798: D/touchview(11302):out::::dispatchTouchEvent
01-26 17:39:53.798: D/touchview(11302):out::::onInterceptTouchEvent
01-26 17:39:53.798: D/touchview(11302):mid::::dispatchTouchEvent
01-26 17:39:53.798: D/touchview(11302): mid::::onTouchEvent
01-26 17:39:53.848: D/touchview(11302):out::::dispatchTouchEvent
01-26 17:39:53.848: D/touchview(11302):out::::onInterceptTouchEvent
01-26 17:39:53.848: D/touchview(11302):mid::::dispatchTouchEvent
01-26 17:39:53.848: D/touchview(11302):mid::::onTouchEvent
01-26 17:39:53.868: D/touchview(11302):out::::dispatchTouchEvent
01-26 17:39:53.868: D/touchview(11302):out::::onInterceptTouchEvent
01-26 17:39:53.868: D/touchview(11302):mid::::dispatchTouchEvent
01-26 17:39:53.868: D/touchview(11302):mid::::onTouchEvent
01-26 17:39:53.878: D/touchview(11302):out::::dispatchTouchEvent
01-26 17:39:53.878: D/touchview(11302):out::::onInterceptTouchEvent
01-26 17:39:53.878: D/touchview(11302):mid::::dispatchTouchEvent
01-26 17:39:53.878: D/touchview(11302):mid::::onTouchEvent
01-26 17:39:53.878: D/touchview(11302):out::::dispatchTouchEvent
01-26 17:39:53.878: D/touchview(11302):out::::onInterceptTouchEvent
01-26 17:39:53.878: D/touchview(11302):mid::::dispatchTouchEvent
01-26 17:39:53.878: D/touchview(11302):mid::::onTouchEvent
震惊。。目测事件在进入mid的onTouchEvent的时候没人消费一直mid和out之间弹
设置mid onTouchEvent 返回false
01-26 17:55:34.828: D/touchview(12118):out::::dispatchTouchEvent
01-26 17:55:34.828: D/touchview(12118):out::::onInterceptTouchEvent
01-26 17:55:34.828: D/touchview(12118):mid::::dispatchTouchEvent
01-26 17:55:34.828: D/touchview(12118):mid::::onInterceptTouchEvent
01-26 17:55:34.828: D/touchview(12118):in::::dispatchTouchEvent
01-26 17:55:34.828: D/touchview(12118):in::::onInterceptTouchEvent
01-26 17:55:34.828: D/touchview(12118):in::::onTouchEvent
01-26 17:55:34.828: D/touchview(12118):mid::::onTouchEvent
01-26 17:55:34.828: D/touchview(12118):out::::onTouchEvent
这样的话都只处理了ACTION_DOWN,其余的TouchEvent被外层的Activity处理了
onInterceptTouchEvent()返回true down事件给这层的onTouchEvent处理
ontouchEvent 返回true 则后续的move 和up时间也进到这个ontouchevent里面处理 并且不进本层的onInterceptTouchEvent方法直接是dis->touch
//设置mid的的onTouchEvent返回值为 true
01-26 19:16:45.218: D/touchview(17397): out::::dispatchTouchEvent::::0
01-26 19:16:45.218: D/touchview(17397): out::::onInterceptTouchEvent::::0
01-26 19:16:45.218: D/touchview(17397): mid::::dispatchTouchEvent::::0
01-26 19:16:45.218: D/touchview(17397): mid::::onInterceptTouchEvent::::0
01-26 19:16:45.218: D/touchview(17397): in::::dispatchTouchEvent::::0
01-26 19:16:45.218: D/touchview(17397): in::::onInterceptTouchEvent::::0
01-26 19:16:45.218: D/touchview(17397): in::::onTouchEvent::::0
01-26 19:16:45.218: D/touchview(17397): mid::::onTouchEvent::::0
01-26 19:16:45.228: D/touchview(17397): out::::dispatchTouchEvent::::2
01-26 19:16:45.228: D/touchview(17397): out::::onInterceptTouchEvent::::2
01-26 19:16:45.228: D/touchview(17397): mid::::dispatchTouchEvent::::2
01-26 19:16:45.228: D/touchview(17397): mid::::onTouchEvent::::2
01-26 19:16:45.228: D/touchview(17397): out::::dispatchTouchEvent::::2
01-26 19:16:45.228: D/touchview(17397): out::::onInterceptTouchEvent::::2
01-26 19:16:45.228: D/touchview(17397): mid::::dispatchTouchEvent::::2
01-26 19:16:45.228: D/touchview(17397): mid::::onTouchEvent::::2
01-26 19:16:45.248: D/touchview(17397): out::::dispatchTouchEvent::::2
01-26 19:16:45.248: D/touchview(17397): out::::onInterceptTouchEvent::::2
01-26 19:16:45.248: D/touchview(17397): mid::::dispatchTouchEvent::::2
01-26 19:16:45.248: D/touchview(17397): mid::::onTouchEvent::::2
01-26 19:16:45.268: D/touchview(17397): out::::dispatchTouchEvent::::2
01-26 19:16:45.268: D/touchview(17397): out::::onInterceptTouchEvent::::2
01-26 19:16:45.268: D/touchview(17397): mid::::dispatchTouchEvent::::2
01-26 19:16:45.268: D/touchview(17397): mid::::onTouchEvent::::2
01-26 19:16:45.428: D/touchview(17397): out::::dispatchTouchEvent::::2
01-26 19:16:45.428: D/touchview(17397): out::::onInterceptTouchEvent::::2
01-26 19:16:45.428: D/touchview(17397): mid::::dispatchTouchEvent::::2
01-26 19:16:45.428: D/touchview(17397): mid::::onTouchEvent::::2
01-26 19:16:45.428: D/touchview(17397): out::::dispatchTouchEvent::::1
01-26 19:16:45.428: D/touchview(17397): out::::onInterceptTouchEvent::::1
01-26 19:16:45.428: D/touchview(17397): mid::::dispatchTouchEvent::::1
01-26 19:16:45.428: D/touchview(17397): mid::::onTouchEvent::::1
0 是down 2 是move 1 是up
后续的事件只在mid和out之间处理
补上测试用的demo
http://download.csdn.net/detail/shix_foot/6885923