Android知识梳理之事件传递机制

来源:互联网 发布:java服务器socket编程 编辑:程序博客网 时间:2024/04/29 14:40
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,事件分发分为两种情况:
  1. 如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent() 进行消费;
  2. 如果当前 ViewGrop 获取的事件,则会将事件返回给父 View 的  onTouchEvent() 进行消费。
  3. 如果在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 时相同。
0 0
原创粉丝点击