一、笔记链接

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. Linux/Android——Input系统之InputReader (七)
  2. Android(安卓)无线接口层RIL(Radio Layer Interface)——RILD
  3. Android笔记Android基于事件监听器处理机制
  4. android 触摸屏 相关文章
  5. Android(安卓)-- Android(安卓)Init进程的处理流程分析
  6. Android(安卓)事件分发机制总结
  7. Android事件分发机制
  8. android 事件分发机制(源码解析)
  9. Android事件处理方法总结-Handler消息处理

随机推荐

  1. win下远程连接linux下mysql
  2. DRBD+Heartbeat+Mysql高可用读写分离架构
  3. 在sqlzoo上自学加入#10教程
  4. 如何确定使用Java和MySQL的插入或更新是
  5. linux6.4搭建mysql主从复制
  6. php数据库数据转换为js中的json对象
  7. mysql 怎么给一个表一次增加多个字段, mys
  8. mysql 数据库自增id 的总结
  9. 最近升级mysql5.7出现下面问题,ORDER BY c
  10. win server 2008 R2 已有apache 、mysql,