Android知识梳理之事件传递机制
2016-04-20 13:44
337 查看
Android的事件传递机制.
首先我们来明白一些相关的概念:
什么是事件呢?这里的事件就是指触摸的事件,我们知道当我们点击手机的屏幕的时候按下(down),移动(move),抬起(up).这样的一个过程就称为一个事件序列.如:down,move.move...,up当然可以是没有移动这个事件的,但是点击和抬起的事件是必须要有的.例如:down,up.
View和ViewGrop。Viewgrop我们可以理解为是存放View的容器,如:relativelayout,linerlayout等等都是继承自ViewGrop.View则是最小的控件如:TextView,ImageView等等都是继承自View的.另外Viewgrop是继承自View的.
事件传递的顺序是:1、传递顺序:Activity->Window->View
Activity中没有onInterceptTouchEvent()方法,也就是说activity不能对事件进行拦截(这不难理解activity处在事件的顶层).
View中没有onInterceptTouchEvent()方法.
这里的事件包含如DOWN,MOVE和UP事件.如果谁在onTouchEvent()里面处理了DOWN,那么所有的动作(MOVE,UP)都将交给这个View来处理.一般我们在自定义ViewGroup时不会拦截Down事件,因为一旦拦截了Down事件,那么后续的Move和Up事件都不会再传递下去到子元素了,事件以后都会只交给ViewGroup这里。
当发生touch事件的时候,首先是由activity逐渐向内传递.如果到了最底层的控件仍然没有对事件作出处理那么事件将会回传.
如果执行到了事件分发public boolean dispatchTouchEvent(MotionEvent
ev),这个方法返回值有三种:
如果 return true,事件会分发给当前
View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递(相当于事件被该方法吃掉了,既不会上传也不会下发,也不会走自己的onTouchEvent方法);
如果 return false,事件分发分为两种情况:
如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent() 进行消费;
如果当前 ViewGrop 获取的事件,则会将事件返回给父 View 的 [b]onTouchEvent()[/b] 进行消费。
如果在activity的dispatchTouchEvent(MotionEvent
ev)中返回false那么该事件也会消失(相当于事件被该方法吃掉了,既不会上传也不会下发,也不会走自己的onTouchEvent方法)
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前
View 的 onInterceptTouchEvent
方法。
如果执行到了事件拦截:onInterceptTouchEvent方法,这个时候也是有三种返回值的:
如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前
View 的 onTouchEvent
()进行处理(如果不处理继续向上回传);
如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 ViewGrop
上的事件会被传递到子 ViewGrop 上,再由子 ViewGrop 的 dispatchTouchEvent() 来开始这个事件的分发;
如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev)这里也是分两种情况:
1.如果点击ViewGroup,则控件树是Activity-->ViewGroup(也就是没有子控件了,该ViewGrop是最底层的),调用该ViewGrop的onTouchEvent()(也就是自己将事件消费掉,自己如果不消费ontouch事件会继续回传);
2.如果点击View,则是Activity-->ViewGroup-->View(也就是的ViewGroup存在子View的情况).将事件从ViewGroup转移到View的dispatchTouchEvent()(也就是将事件传递给子控件的dispatchTouchEvent()事件进行分发的操作)。
如果执行到事件响应:public boolean onTouchEvent(MotionEvent ev),这个时候也是有三种返回值的:
如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了
false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回
false,这个事件就会“消失”,而且接收不到下一次事件。
如果返回了 true 则会接收并消费该事件,此时事件就交给该View进行消费,不会再向上传递.
如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
首先我们来明白一些相关的概念:
什么是事件呢?这里的事件就是指触摸的事件,我们知道当我们点击手机的屏幕的时候按下(down),移动(move),抬起(up).这样的一个过程就称为一个事件序列.如:down,move.move...,up当然可以是没有移动这个事件的,但是点击和抬起的事件是必须要有的.例如:down,up.
View和ViewGrop。Viewgrop我们可以理解为是存放View的容器,如:relativelayout,linerlayout等等都是继承自ViewGrop.View则是最小的控件如:TextView,ImageView等等都是继承自View的.另外Viewgrop是继承自View的.
事件传递的顺序是:1、传递顺序:Activity->Window->View
Activity中没有onInterceptTouchEvent()方法,也就是说activity不能对事件进行拦截(这不难理解activity处在事件的顶层).
View中没有onInterceptTouchEvent()方法.
这里的事件包含如DOWN,MOVE和UP事件.如果谁在onTouchEvent()里面处理了DOWN,那么所有的动作(MOVE,UP)都将交给这个View来处理.一般我们在自定义ViewGroup时不会拦截Down事件,因为一旦拦截了Down事件,那么后续的Move和Up事件都不会再传递下去到子元素了,事件以后都会只交给ViewGroup这里。
当发生touch事件的时候,首先是由activity逐渐向内传递.如果到了最底层的控件仍然没有对事件作出处理那么事件将会回传.
如果执行到了事件分发public boolean dispatchTouchEvent(MotionEvent
ev),这个方法返回值有三种:
如果 return true,事件会分发给当前
View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递(相当于事件被该方法吃掉了,既不会上传也不会下发,也不会走自己的onTouchEvent方法);
如果 return false,事件分发分为两种情况:
如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent() 进行消费;
如果当前 ViewGrop 获取的事件,则会将事件返回给父 View 的 [b]onTouchEvent()[/b] 进行消费。
如果在activity的dispatchTouchEvent(MotionEvent
ev)中返回false那么该事件也会消失(相当于事件被该方法吃掉了,既不会上传也不会下发,也不会走自己的onTouchEvent方法)
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前
View 的 onInterceptTouchEvent
方法。
如果执行到了事件拦截:onInterceptTouchEvent方法,这个时候也是有三种返回值的:
如果 onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前
View 的 onTouchEvent
()进行处理(如果不处理继续向上回传);
如果 onInterceptTouchEvent 返回 false,则表示将事件放行,当前 ViewGrop
上的事件会被传递到子 ViewGrop 上,再由子 ViewGrop 的 dispatchTouchEvent() 来开始这个事件的分发;
如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev)这里也是分两种情况:
1.如果点击ViewGroup,则控件树是Activity-->ViewGroup(也就是没有子控件了,该ViewGrop是最底层的),调用该ViewGrop的onTouchEvent()(也就是自己将事件消费掉,自己如果不消费ontouch事件会继续回传);
2.如果点击View,则是Activity-->ViewGroup-->View(也就是的ViewGroup存在子View的情况).将事件从ViewGroup转移到View的dispatchTouchEvent()(也就是将事件传递给子控件的dispatchTouchEvent()事件进行分发的操作)。
如果执行到事件响应:public boolean onTouchEvent(MotionEvent ev),这个时候也是有三种返回值的:
如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了
false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回
false,这个事件就会“消失”,而且接收不到下一次事件。
如果返回了 true 则会接收并消费该事件,此时事件就交给该View进行消费,不会再向上传递.
如果返回 super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories