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

Android事件分发与消费

2016-12-03 14:28 197 查看
关于andorid的事件分发和消费,之前在网上看了好多博客,当时觉得看明白了,事后遇到时又会变的有点模糊,为了巩固知识,那就写一篇博客来记录下吧。

一般Android的事件有抽象的键盘或触摸屏,还有鼠标的吧,不过鼠标这个我倒没研究过,只是在网上又看到过博客,关于键盘的分发和响应事件我想对于android tv的的比较多吧,触屏一般都是手机或pad,就拿touch来说,在tv上的keyEvent事件类似,先上张图



从图中可以看出,Android中不同的控件所具有的事件分发、拦截和响应稍有不同,主要表现在Activity本身不具有事件拦截,不是ViewGroup的最小view单元不具有事件分发和

事件拦截(因为它没有自己的子View)。所以他只能消费。

 

 

事件分发:public boolean dispatchTouchEvent(MotionEvent ev):最上层先捕获、分发、拦截,依次向下传递 注意:向下分发时亦可以消费。 

       当监听到触摸事件后,由Activity首先捕获到,重写此方法后,进行事件分发处理过程,我们可以发现,当返回值为true时,表示该事件在本层不再进行分发且已经在事件分

发自身中被消费了。至此,事件已经完结。这样Activity其他控件将不再响应触摸事件。当返回值为false时,表明事件在本层不再继续进行分发,并交由上层控件的

onTouchEvent方法进行消费。如果返回默认的方法super.dispatchTouchEvent(ev);将会把触摸事件传递给系统默认方法(即拦截事件)处理,这是会执行

onInterceptTouchEvent(MotionEvent ev)处理,由于Activtiy不具有事件拦截的方法将会直接传递给子View或Viewgroud的事件分发处理。 他们的分发和Activy一本一致,唯一不

同的就是在拦截的时候。

 

 

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

如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由本层控件 的 onTouchEvent 进行处理;

如果返回结果是false;则表示不对事件进行拦截,事件得以成功分发到子View。并由子View的dispatchTouchEvent进行处理。

如果返回super.onInterceptTouchEvent(ev),事件默认不会被拦截,交由子View的dispatchTouchEvent进行处理。

 

 

事件响应:public boolean onTouchEvent(MotionEvent ev):事件响应是由下向上的过程

如果事件分发传递到最下层控件里,将会执行最下层控件的此方法,如果处理后返回true,表示该控件消费了此事件,将不再向上传递。如果处理后返回为false,将会继续向上

层传递。让上层的view的此方法来处理。默认的返回值为false。同样的你也可以把此事件传递给手势,让手势来进行处理。至于手势的一些处理,我准备在写一篇博客来记录

一下。路漫漫其修远兮,吾将上下而求索。

 

 总结:1.在事件分发时,无论返回false还是true,都不会交给拦截事件处理,只有返回默认的方法才行。

             2.事件消费时,如果成功通过了上层的拦截的审核,才会通过冒泡向上执行,如果上层直接拦截,当由上层的事件消费。

 

 

 

 

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