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.事件消费时,如果成功通过了上层的拦截的审核,才会通过冒泡向上执行,如果上层直接拦截,当由上层的事件消费。
一般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.事件消费时,如果成功通过了上层的拦截的审核,才会通过冒泡向上执行,如果上层直接拦截,当由上层的事件消费。
相关文章推荐
- Android监听home键,亲测
- android从一个应用跳转到另一个应用
- Android开发技巧——BaseAdapter的另一种优雅封装
- Android开发技巧——BaseAdapter的另一种优雅封装
- Android开发技巧——BaseAdapter的另一种优雅封装
- android adb 查询apk安装到了哪里,已经安装到了哪里?
- ANDROID_SDK_HOME作用其一
- 简单自定义View之TitleBar
- AndroidStudio中编译异常: **.apk does not exist on disk.Error while Installing APK
- Android中的DrawRect()参数解析
- android 开发零起步学习笔记(十八):Android Layout 布局属性全解
- android 录像 录制
- Android源码设计模式分析开源项目
- android NDK和源码中输出Log信息的方法
- Android 四大组件的理解
- 【Android - 进阶】之图片压缩
- adb 模拟按键,调试按键,android测试可以用
- android规范与技巧
- Android使用MulticastSocket实现多点广播图片
- Android手机自动化测试真机运行