您的位置:首页 > 移动开发 > Android开发

Android事件分发笔记

2015-06-23 15:52 387 查看

一、事件分发:public boolean dispatchTouchEvent(MotionEvent ev)

     当有监听到事件时,首先由Activity的捕获到,进入事件分发处理流程。如果事件分发返回true,表示改事件在本层不再进行分发且已经在事件分发自身中被消费了。至此,事件已经完结。如果事件分发返回false,表明事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费。如果事件分发返回系统默认的super.dispatchTouchEvent(ev),事件将分发给本层的事件拦截onInterceptTouchEvent 方法进行处理(如果有的话)。如果没有onInterceptTouchEvent方法,交给子view的dispatchTouchEvent(ev)进行处理。


 

二、事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)             

    如果onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由本层控件的onTouchEvent 进行处理;如果返回结果false,则表示不对事件进行拦截,事件得以成功分发到子View。并由子View的dispatchTouchEvent进行处理。如果返回super.onInterceptTouchEvent(ev),事件默认不会被拦截,交由子View的dispatchTouchEvent进行处理。另外如果onInterceptTouchEvent返回true成功拦截事件,并且后续onTouchEvent在本层成功消费,后续事件就无需执行本层的onInterceptTouchEvent事件。

 

三、事件响应:public boolean onTouchEvent(MotionEvent ev)

   如果onTouchEvent返回true,表示onTouchEvent处理完事件后消费了此次事件。此时事件终结,将不会进行后续的冒泡。如果onTouchEvent返false,事件在onTouchEvent中处理后继续向上层View冒泡,且有上层View的onTouchEvent进行处理,并且事件有记忆功能,下次事件不会分发到该层的dispatchTouchEvent。如果返回super.onTouchEvent(ev),则根据对应View的clickable属性决定返回的是true还是false(例如Button则返回true,TextView则返回false)。总结:从以上过程中可以看出,dispatchTouchEvent无论返回true还是false,事件都不再进行分发,只有当其返回super.dispatchTouchEvent(ev),才表明其具有向下层分发的愿望,但是是否能够分发成功,则需要经过事件拦截onInterceptTouchEvent的审核。事件是否具有冒泡特是由onTouchEvent的返回值决的。

 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android UI 自定义控件