一、笔记链接

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;    }



更多相关文章

  1. android 百度地图定位与覆盖物的添加,以及他们的点击事件
  2. android的窗口机制分析------事件处理
  3. Android Touch事件传递机制
  4. Android 虚拟机及其GC机制
  5. Android的Touch事件处理机制
  6. Android中设计具有背景图的按钮—ImageButton的焦点及事件处理
  7. Android Layout机制研究
  8. android 将鼠标右键点击事件改为点击后返回功能

随机推荐

  1. Getting Started with Qt5 for Android
  2. Robolectric_Quick Start for Eclipse
  3. Android:New Layout Widgets: Space and
  4. Android定时发送短信完整详细示例
  5. Android(安卓)截图工具类
  6. 侧滑菜单(三)
  7. Android(SpreadTurm)获取屏幕亮度,再设置
  8. Android(安卓)ListView滑动回弹——overS
  9. 在Activity中注册广播
  10. Android(安卓)ListView异步加载图片