Android事件分发机制(上事件分发机制(上) ViewGroup的事件分发的事件分发
主要为大家详细介绍了Android ViewGroup的事件分发机制上篇,具有一定的参考价值,感兴趣的小伙伴们可以
参考一下
综述综述
Android中的事件分发机制也就是View与ViewGroup的对事件的分发与处理。在ViewGroup的内部包含了许多View,而
ViewGroup继承自View,所以ViewGroup本身也是一个View。对于事件可以通过ViewGroup下发到它的子View并交由子View
进行处理,而ViewGroup本身也能够对事件做出处理。下面就来详细分析一下ViewGroup对时间的分发处理。
MotionEvent
当手指接触到屏幕以后,所产生的一系列的事件中,都是由以下三种事件类型组成。
1. ACTION_DOWN: 手指按下屏幕
2. ACTION_MOVE: 手指在屏幕上移动
3. ACTION_UP: 手指从屏幕上抬起
例如一个简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->…->ACTION_MOVE-
>ACTION_UP
对于Android中的这个事件分发机制,其中的这个事件指的就是MotionEvent。而View的对事件的分发也是对MotionEvent
的分发操作。可以通过getRawX和getRawY来获取事件相对于屏幕左上角的横纵坐标。通过getX()和getY()来获取事件相对于
当前View左上角的横纵坐标。
三个重要方法三个重要方法
public boolean dispatchTouchEvent(MotionEvent ev)
这是一个对事件分发的方法。如果一个事件传递给了当前的View,那么当前View一定会调用该方法。对于
dispatchTouchEvent的返回类型是boolean类型的,返回结果表示是否消耗了这个事件,如果返回的是true,就表明了这个
View已经被消耗,不会再继续向下传递。
public boolean onInterceptTouchEvent(MotionEvent ev)
该方法存在于ViewGroup类中,对于View类并无此方法。表示是否拦截某个事件,ViewGroup如果成功拦截某个事件,
那么这个事件就不在向下进行传递。对于同一个事件序列当中,当前View若是成功拦截该事件,那么对于后面的一系列事件
不会再次调用该方法。返回的结果表示是否拦截当前事件,默认返回false。由于一个View它已经处于最底层,它不会存在子
控件,所以无该方法。
public boolean onTouchEvent(MotionEvent event)
这个方法被dispatchTouchEvent调用,用来处理事件,对于返回的结果用来表示是否消耗掉当前事件。如果不消耗当前
事件的话,那么对于在同一个事件序列当中,当前View就不会再次接收到事件。
View事件分发流程图事件分发流程图
对于事件的分发,在这里先通过一个流程图来看一下整个分发过程。