1、当触摸屏幕时,最先执行的是Activity中的

     public boolean dispatchTouchEvent (MotionEvent ev) {
        if (ev.getAction() == MotionEvent. ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

如果某些事件无法监测到,可以重写此方法,优先处理ev,然后再调用super.dispatchTouchEvent。
2、Activity中的onTouchEvent的调用时机如下:当Activity下的所有view的onTouchEvent都返回false时(都不处理touch事件,默认返回false),才会调用Activity中的onTouchEvent。
因此,该事件主要用于点击视图的外围,无view的空白处。
另外,从view里的onTouchEvent代码可以看出,如果view设置了clickable = true,则会返回true,消耗此次Touch事件。
         if (((viewFlags & CLICKABLE) == CLICKABLE ||
                (viewFlags & LONG_CLICKABLE ) == LONG_CLICKABLE)) {
            switch (event.getAction()) {
               。。。。
            }
            return true;
        }

3、
第一种情况:父viewgroup的onInterceptTouchEvent中,返回默认值,同时子view中也返回默认值:
可以看到,由activity进行dispatchTouchEvent,但是并不调用activity中的Touchevetnt,而是传递到最外层viewgroup中,调用onInterceptTouchEvent,其返回false,因此继续向下传递,一直到view。然后view调用onTouchEvent,并返回默认值false。
onTouchEvent再从内向外调用,直到最外层的viewgroup。最后调用activity的onTouchEvent。
注:当手指抬起时,dispatchTouchEvent不再像下传递,因此viewgroup和子view都不再相应,此时activity的onTouchEvent相应ActionUp事件。(问题的根源在于view返回false,表示不再接受下一个事件)
第二种情况:父viewgroup的onInterceptTouchEvent中,返回默认值,同时子view中返回true:
可以看到,当ActionDown传递到子view中时,子view返回true。表示消费了此事件,因此ontouchEvent不再传递到父viewgroup以及activity。当ActionUp传递时亦然。因此从子view的角度看,无需对父view进行任何设置,相当于子view直接与手指对话。
第三种情况:父viewgroup的onInterceptTouchEvent中,返回true,同时子view中返回true:
可以看到,如果父viewgroup在onInterceptTouchEvent中返回true,其子viewgrou的onInterceptTouchEvent不会被调用,子view的onTouchEvent也不会被调用。从而对其子视图进行了拦截。从子视图角度看其onTouchEvent方法不会被调用,而Activity的onTouchEvent则可以被调用。
注:Activity的onTouchEvent的优先级是最低的。
最后,反过来看第1条,当子view消耗touch事件时,会直接使getWindow().superDispatchTouchEvent(ev)返回true,因此不再调用activity的onTouchEvent。
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }

转载于:https://www.cnblogs.com/tanqiantot/archive/2013/06/05/3126810.html

Android中的Touch事件处理流程相关推荐

  1. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  2. 从源码解析-Android中View的绘制流程及performTraversals方法

    谈谈Activity的setContentView是怎么加载XML视图的 谈谈Activity的View怎么与View绘制工具ViewRootImpl关联的 在前面两篇文章中分析了View是如何跟绘制 ...

  3. android art虚拟机安装,Android中art虚拟机启动流程

    本文基于Android8.1系统进行研究 一.启动zygote 在Linux内核启动完成后,首先启动系统的第一个进程init进程 init进程会读取init.rc中的配置文件 其中有Zygote的配置 ...

  4. android的构成和工作流程,分析Android中View的工作流程

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 在分析View的工作流程时,需要先分析一个很重要的类,MeasureSpec.这个类在View的测量(Measure)过 ...

  5. Cocoa Touch事件处理流程--响应者链

    一.事件分类 对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕.晃动设备.通过遥控设施控制设备.对应的事件类型有以下三种: 1.触屏事件(Touch Event) 2.运动事件(Moti ...

  6. Android中Activity的启动流程和组织管理方式(Backstack、Task)

    前言: Android对Activity的组织管理会引入一些名词概念术语,像Stack.Task等,本文会做简单介绍.Activity的启动.切换以及组织管理会受不同的配置和属性的影响,本文会简单介绍 ...

  7. Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题

    1).按下按钮,不滑动,触发按钮功能 (2).按下按钮,滑动触发滑动事件 这里的按下包含长按和短按情况 首先要解决这个问题需要明白Android中的Touch事件是如何进行处理的,这里有一篇文章:An ...

  8. Android 中触摸事件与点击事件分析

    触摸事件 两种检测触摸事件的方式: 设置触摸监听  setOnTouchListener 返回 true: 表示消费事件 , 可以检测到 down/move/up 事件 返回 false: 不消费事件 ...

  9. Launcher桌面点击长按拖动事件处理流程分析

    本文原创http://blog.csdn.net/yanbin1079415046,转载请注明出处. Android事件处理是android中很重要的一部分内容,而在ADW_Launcher中,and ...

最新文章

  1. Java如何获取系统cpu、内存、硬盘信息
  2. 包括 一个 20像素的黑条条
  3. apache 定义日志格式 及日志记录
  4. 高并发的epoll+线程池,epoll在线程池内
  5. [J2ME QA]真机报告MontyThread -n的错误之解释
  6. 京东智联云分布式低延时RTC系统
  7. centos7系统根目录扩容
  8. 怎么使用mysql打表_MySQL的表使用
  9. IOS socket编程--Asyncsocket
  10. rpm方式安装MySQL-5.6
  11. react封装函数_React 模式-将函数作为 children 传入和 render prop - 极客教程
  12. 阿里影业“灯塔平台”今日正式启动,阿里影视云解决方案强势推出
  13. SQL获取目标时间点或日期的方法
  14. idea的导包快捷键+自动导包设置
  15. 同花顺python_同花顺python
  16. 空间计量经济学(2)---广义空间自回归与空间误差模型
  17. 遥感原理与应用_专家报告 | 叶绿素荧光卫星遥感—原理与应用
  18. 大数据服务器迁移步骤及介绍
  19. vue颜色选择器插件
  20. 【MySQL】轻松学习 唯一索引

热门文章

  1. python语言程序设计计算机二级难不难_全国计算机二级的难度有多大?
  2. 构建Java Web开发环境
  3. C++ Socket编程步骤
  4. android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
  5. python、中循环功能可通过什么命令实现_python定时执行指定函数的方法 Python如何定时循环执行命令?...
  6. rgb fusion检测不到显卡_【论文阅读27】Co-Fusion
  7. auot lisp 选择集处理_离散量的计算机处理63_1Cv6
  8. 2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...
  9. idea 运行单个main方法_IntelliJ IDEA 运行你的第一个Java应用程序 idea运行main方法
  10. 前端全栈大佬是如何使用javaScript实现一个焦点图