android touch事件传递

来源:互联网 发布:阿里云服务器空间满了 编辑:程序博客网 时间:2024/03/29 13:33

Android事件分发机制完全解析


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

0 0
原创粉丝点击