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

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 时相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 事件传递