安卓事件传递机制图解

一.前言

说起安卓的事件传递机制我们都知道是自上而下又自下而上,相信很多人都能说出来不少,我们今天来用图例的方式来给大家展示一下.

二.正常简单事件传递过程图

我们一个activity上有一个Linearlayout,里面有一个TextView
点击textView的时候事件传递的步骤如下.
这里写图片描述

二.其他复杂事件传递过程图

这里写图片描述

三.up事件传递过程

上面我们说的是down事件,那么up事件是不是跟down事件传递过程一致的?
我们做一个实验,先做一个简单的布局,如下

这里写图片描述

1 clickTextView

E/MainActivity:: dispatchTouchEvent--->ACTION_DOWN
E/MyLinearLayout:: dispatchTouchEvent--->ACTION_DOWN
E/MyLinearLayout:: InterceptTouchEvent--->ACTION_DOWN
E/MyTextView:: dispatchTouchEvent--->ACTION_DOWN
E/MyTextView:: onTouchEvent--->ACTION_DOWN:false
E/MyTextView:: ******************************************************
E/MyLinearLayout:: onTouchEvent--->ACTION_DOWN:false
E/MainActivity:: onTouchEvent--->ACTION_DOWN:false
E/MainActivity:: dispatchTouchEvent--->ACTION_UP
E/MainActivity:: onTouchEvent--->ACTION_UP:false

2 clickButton

E/MainActivity:: dispatchTouchEvent--->ACTION_DOWN
E/MyLinearLayout:: dispatchTouchEvent--->ACTION_DOWN
E/MyLinearLayout:: InterceptTouchEvent--->ACTION_DOWN
E/MyButton: dispatchTouchEvent--->ACTION_DOWN
E/MyButton: onTouchEvent--->ACTION_DOWN:true
E/MyButton: ******************************************************
E/MainActivity:: dispatchTouchEvent--->ACTION_UP
E/MyLinearLayout:: dispatchTouchEvent--->ACTION_UP
E/MyLinearLayout:: InterceptTouchEvent--->ACTION_UP
E/MyButton: dispatchTouchEvent--->ACTION_UP
E/MyButton: onTouchEvent--->ACTION_UP:true
E/MyButton: ******************************************************

我们发现textView的up事件并没有向下传递. 而button的up事件又走了一次down事件的流程.而我们知道TextView的ontouch默认返回的是false,Button的ontouch默认返回的是true.
这里我们得出结论:
即某个View一旦开始处理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent方法返回false),那么同一事件序列的其他方法都不会在交给它处理。

四.实战常用的方法

这里给大家介绍 个方法
1:view.getParent().requestDisallowInterceptTouchEvent(true);
获取子view控件的父布局即条目的根部局,通过根部局,让父控件不要拦截事件
2:otherView.onTouchEvent(event);
将子view的事件传递给otherView

3: 获取点击事件在屏幕中的坐标
float rawX = event.getRawX();
float rawY = event.getRawY();

猜你喜欢

转载自blog.csdn.net/jin870132/article/details/71055739