一.前言
说起安卓的事件传递机制我们都知道是自上而下又自下而上,相信很多人都能说出来不少,我们今天来用图例的方式来给大家展示一下.
二.正常简单事件传递过程图
我们一个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();