MyException - 我的异常网
当前位置:我的异常网» Android » Android事件散发机制

Android事件散发机制

www.MyException.Cn  网友分享于:2013-07-28  浏览:45次
Android事件分发机制


应用程序里少不了自定义Touch事件,前几天还写了个左右滑动的界面,界面里放置ListView还要上下滑动,着实头疼了一番。就把时间分发机制看了看。

 

在界面上,Activity最先接收事件、然后是最外层ViewGroup(记为VG0),然后VG1,VG2,....一般我们会需要一个Button、TextView之类的View放在最里层。

 

对于Activity和View来说,有dispatchTouchEvent和OnTouchEvent两个函数处理Touch事件

对于ViewGroup来说,多了一个onInterceptTouchEvent函数,这个函数的目的是用来判定当前的Touch事件的分发方向。

 

总体来说,事件由Activity的dispatchTouchEvent接收,然后传递给VG0的dispatchTouchEvent,VG0传给VG1的dispatchTouchEvent,知道最后传给View的dispatchTouchEvent,View已经不需要再dispatch了,所以交给了自己的onTouchEvent函数,然后从下往上,依次传给VGn的onTouchEvent,直到传给VG0的onTouchEvent,再传给Activity的onTouchEvent。

 

遵循这样的原则

MotionEven先由dispatchTouchEvent从上往下分发,然后由onTouchEvent从下往上依次传递。

一旦某处消费掉这个MotionEvent(即该函数返回true),这个事件不再继续传递。本次事件中的下一个MotionEvent也将意图传递到此(除非中途被消费掉)。

一旦某层VG或者V没有消费掉MotionEvent,之后的MotionEvent将不再传递到此层。

 

时隔很久,我继续来了,哇哈哈哈哈!

 

画图太难画了,举个例子吧:

 

Activity界面有个LinearLayout,LinearLayout里有个TextView

 

触碰界面,

Activity的dispatch接收到事件

返回true,则本次事件结束,本次事件只会传递到dispatch,不再往下分发; ;

返回false,传递该事件给LinearLayout的dispatch函数

 

LinearLayout的dispatch接收到该事件

返回true,本次事件只会传递到dispatch,不再往下分发;

返回false,访问onInterceptTouchEvent

 

如果onInterceptTouchEvent返回true,直接传递给LinearLayout的onTouchEvent函数,不分发给TextView;

如果onInterceptTouchEvent返回false,传递给TextView的dispatch

 

TextView的dispath接收到该事件

返回true,本次事件只会传递到dispatch,不再往下分发;

返回false,传递给onTouchEvent

 

TextView的onTouchEvent接收到该事件

返回true,本次事件只会传递到onTouchEvent,不再继续分发;

返回false,传递给LinearLayout的onTouchEvent,注意,现在开始往上传递了。

 

LinearLayout的onTouchEvent接收到该事件

返回true,本次事件只会传递到onTouchEvent,不再继续分发;

返回false,传递给Activity的onTouchEvent。

 

Activity的onTouchEvent接收到该事件

返回ture,后续事件继续走下来;

发挥false,没有消费者,后续事件直到Activity的dispatch,不再往下分发!

 

 

几个关键点是

1、事件被消费之前,一直向下分发。

2、事件未被消费,后续事件将不再传递。

3、后续事件是指本次按下之后的事件,想要激活下次,只需解除所有touch即可。

4、ViewGroup的onintercept用来控制向子view 的事件分发

文章评论

总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
 程序员的样子
程序员的样子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
代码女神横空出世
代码女神横空出世
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
中美印日四国程序员比较
中美印日四国程序员比较
老程序员的下场
老程序员的下场
旅行,写作,编程
旅行,写作,编程
编程语言是女人
编程语言是女人
10个调试和排错的小建议
10个调试和排错的小建议
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
漫画:程序员的工作
漫画:程序员的工作
那些争议最大的编程观点
那些争议最大的编程观点
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
每天工作4小时的程序员
每天工作4小时的程序员
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我是如何打败拖延症的
我是如何打败拖延症的
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员和编码员之间的区别
程序员和编码员之间的区别
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员都该阅读的书
程序员都该阅读的书
我的丈夫是个程序员
我的丈夫是个程序员
程序员必看的十大电影
程序员必看的十大电影
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Java程序员必看电影
Java程序员必看电影
一个程序员的时间管理
一个程序员的时间管理
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
如何成为一名黑客
如何成为一名黑客
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有