事件拦截机制

1、什么是触摸事件?
触摸事件就是捕获触摸屏幕后产生的事件。

2、Android为触摸事件封装了一个类--MotionEvent
View提供获取坐标的方法
getTop():获取得到的是View自身的顶边到其父布局顶边的距离
getLeft():获取得到的是View自身的左边到其父布局左边的距离
getRight():获取得到的是View自身的右边边到其父布局左边的距离
getBottom():获取得到的是View自身的底边到其父布局顶边的距离
MotionEvent提供的方法
getX()和getY():获得的永远是相对view的触摸位置坐标(这两个值不会超过view的长度和宽度)。
getRawX()和getRawY():有这两个函数获得的x,y值是绝对坐标,是相对于屏幕的。

事件拦截机制_第1张图片
image.png
MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE等来区分事件类型
常见的动作常量:
public static final int ACTION_DOWN              = 0;单点触摸动作
public static final int ACTION_UP                    = 1;单点触摸离开动作
public static final int ACTION_MOVE              = 2;触摸点移动动作
public static final int ACTION_CANCEL          = 3;触摸动作取消
public static final int ACTION_OUTSIDE         = 4;触摸动作超出边界
public static final int ACTION_POINTER_DOWN     = 5;多点触摸动作
public static final int ACTION_POINTER_UP       = 6;多点离开动作

3、原理与生活类似
假设你所在的公司,有一个总经理,级别最高;他下面有一个部长,级别次之;最低层, 就是干活的你,没有级别。现在董事会交给总经理一项任务,总经理将这项任务布置给了部长,部长又把任务安排给了你。而当你好不容易干完活了,你就把任务交给部长,部长觉得任务完成得不错,于是就签了他的名字交给总经理,总经理看了也觉得不错,就业签了名字交给董事会。这样,一个任务就顺利完成了。

4、Android控件架构

事件拦截机制_第2张图片
image.png
事件拦截机制_第3张图片
image.png

对事件分发的顺序为:Activity–>PhoneWindow->DecorView->yourView;
控件对事件处理的优先级:onTouch>onTouchEvent>onClick

5、事件返回值
事件传递(onInterceptTouchEvent)的返回值非常容易理解:true,拦截,不继续;false,不拦截,继续流程。
事件处理()的返回值也类似:true,处理了,不用审核了;false,给上级处理。

6、事件流程
一个总经理——MyViewGroupA,最外层的ViewGroup(红色)。
一个部长——MyViewGroupB,中间的ViewGroup(深蓝色)。
一个干活的你——MyView,在最底层(灰色)。


事件拦截机制_第4张图片
image.png

运行我们的项目,先看看我们3个view的加载情况吧:

image.png

可以看出是由外到内加载的。

我们先不修改任何返回值,只是点击一下View
log日志:
D/blankj: ViewGroupA dispatchTouchEvent0
D/blankj: ViewGroupA onInterceptTouchEvent0
D/blankj: ViewGroupB dispatchTouchEvent0
D/blankj: ViewGroupB onInterceptTouchEvent0
D/blankj: View dispatchTouchEvent0
D/blankj: View onTouchEvent0
D/blankj: ViewGroupB onTouchEvent0
D/blankj: ViewGroupA onTouchEvent0
事件流程如下:


事件拦截机制_第5张图片
image.png

现在假如我们修改MyViewGroupA中的onInterceptTouchEvent()事件,将其返回值改为True,点击任意一层view,
现在我们再看log日志:
D/blankj: ViewGroupA dispatchTouchEvent0
D/blankj: ViewGroupA onInterceptTouchEvent0
D/blankj: ViewGroupA onTouchEvent0
事件流程如下:


事件拦截机制_第6张图片
image.png

我们让部长(MyViewGroupB)也来当一次好人,即让部长(MyViewGroupB)使用onInterceptTouchEvent()方法返回true,把事件拦截下来,Log就会使以下这样。
D/blankj: ViewGroupA dispatchTouchEvent0
D/blankj: ViewGroupA onInterceptTouchEvent0
D/blankj: ViewGroupB dispatchTouchEvent0
D/blankj: ViewGroupB onInterceptTouchEvent0
D/blankj: ViewGroupB onTouchEvent0
D/blankj: ViewGroupA onTouchEvent0
事件流程如下:


事件拦截机制_第7张图片
image.png

那么你突然有一天受不了老板的压迫了,罢工不干了,那么你的任务就没人做了,也就不用报告上机了,所以就直接返回true。现在再来看看Log,如下所示。
D/blankj: ViewGroupA dispatchTouchEvent0
D/blankj: ViewGroupA onInterceptTouchEvent0
D/blankj: ViewGroupB dispatchTouchEvent0
D/blankj: ViewGroupB onInterceptTouchEvent0
D/blankj: View dispatchTouchEvent0
D/blankj: View onTouchEvent0
事件流程如下:

事件拦截机制_第8张图片
image.png

你可能感兴趣的:(事件拦截机制)