一、笔记链接
1. android 触摸事件传递机制
Android:30分钟弄明白Touch事件分发机制 https://www.cnblogs.com/linjzong/p/4191891.html
2. android OnTouchListener,onTouchEvent,onClickListener执行顺序
http://blog.csdn.net/xw13782513621/article/details/76648557
二、简记
1. android 触摸事件传递机制
1.1Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。
1.2.ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。
1.3.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。
1.4.当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。
1.5.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。
/**
* ViewGroup
* @param ev
* @return
*/
public boolean dispatchTouchEvent(MotionEvent ev){
....//其他处理,在此不管
View[] views=getChildView();
for(int i=0;i
要特别注意FrameLayout中子view的触摸事件传递:默认情况下(即不消费触摸事件),重叠的多个view都会接收到触摸事件
FrameLayout 实例1(评论是重点), 实例2
2. android OnTouchListener,onTouchEvent,onClickListener执行顺序
首先执行OnTouchListener,之后为onTouchEvent,最后才执行onClickListener内的方法
public boolean dispatchTouchEvent(MotionEvent event) {
......
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
if (!result && onTouchEvent(event)) {
result = true;
}
......
return result;
}
public boolean onTouchEvent(MotionEvent event) {
......
switch (action) {
case MotionEvent.ACTION_UP:
......
performClick();
......
break;
......
}
public boolean performClick() {
final boolean result;
final ListenerInfo li = mListenerInfo;
if (li != null && li.mOnClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this);
result = true;
} else {
result = false;
}
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
return result;
}