Android中的Touch事件处理流程

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TensorFlow学习笔记:神经网络八股】(实现MNIST数据集手写数字识别分类以及FASHION数据集衣裤识别分类)

课程来源:人工智能实践:Tensorflow笔记2 文章目录前言一、搭建网络八股sequential1.函数介绍2.6步法实现鸢尾花分类二、搭建网络八股class1.创建自己的神经网络模板:2.调用自己创建的model对象三、MNIST数据集1.用sequential搭建网络实现手写数字识别2.用…

c语言 在执行区域没有空格,C语言上机操作指导之TurboC.doc

C语言上机操作指导之 -------- Turbo C程序设计是实践性很强的过程,任何程序都必须在计算机上运行,以检验程序的正确与否。因此在学习程序设计中,一定要重视上机实践环节,通过上机可以加深理解 C语言的有关概念,以巩固…

java 根据类名示例化类_Java即时类| from()方法与示例

java 根据类名示例化类即时类from()方法 (Instant Class from() method) from() method is available in java.time package. from()方法在java.time包中可用。 from() method is used to return a copy of the Instant from the given TemporalAccessor object. from()方法用于…

第十二章 图形用户界面

第十二章 图形用户界面 GUI就是包含按钮、文本框等控件的窗口 Tkinter是事实上的Python标准GUI工具包 创建GUI示例应用程序 初探 导入tkinter import tkinter as tk也可导入这个模块的所有内容 from tkinter import *要创建GUI,可创建一个将充当主窗口的顶级组…

Sqlserver 2005 配置 数据库镜像:数据库镜像期间可能出现的故障:镜像超时机制

数据库镜像期间可能出现的故障 SQL Server 2005其他版本更新日期: 2006 年 7 月 17 日 物理故障、操作系统故障或 SQL Server 故障都可能导致数据库镜像会话失败。数据库镜像不会定期检查 Sqlservr.exe 所依赖的组件来验证组件是在正常运行还是已出现故障。但对于某…

江西理工大学期末试卷c语言,2016年江西理工大学信息工程学院计算机应用技术(加试)之C语言程序设计复试笔试最后押题五套卷...

一、选择题1. 设有函数定义:( )。A. B. C. D. 答:A则以下对函数sub 的调用语句中,正确的是【解析】函数的参数有两个,第一个是整型,第二个是字符类型,在调用函数时,实参必须一个是整型&#xff…

第十三章 数据库支持

第十三章 数据库支持 本章讨论Python数据库API(一种连接到SQL数据库的标准化方式),并演示如何使用这个API来执行一些基本的SQL。最后,本章将讨论其他一些数据库技术。 关Python支持的数据库清单 Python数据库API 标准数据库API…

【神经网络八股扩展】:自制数据集

课程来源:人工智能实践:Tensorflow笔记2 文章目录前言1、文件一览2、将load_data()函数替换掉2、调用generateds函数4、效果总结前言 本讲目标:自制数据集,解决本领域应用 将我们手中的图片和标签信息制作为可以直接导入的npy文件。 1、文件一览 首先看…

java 批量处理 示例_Java中异常处理的示例

java 批量处理 示例Here, we will analyse some exception handling codes, to better understand the concepts. 在这里,我们将分析一些异常处理代码 ,以更好地理解这些概念。 Try to find the errors in the following code, if any 尝试在以下代码中…

hdu 1465 不容易系列之一

http://acm.hdu.edu.cn/showproblem.php?pid1465 今天立神和我们讲了错排,才知道错排原来很简单,从第n个推起: 当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置…

第十四章 网络编程

第十四章 网络编程 本章首先概述Python标准库中的一些网络模块。然后讨论SocketServer和相关的类,并介绍同时处理多个连接的各种方法。最后,简单地说一说Twisted,这是一个使用Python编写网络程序的框架,功能丰富而成熟。 几个网…

c语言输出11258循环,c/c++内存机制(一)(转)

一:C语言中的内存机制在C语言中,内存主要分为如下5个存储区:(1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。(2)堆(Heap):由程序员用…

【神经网络八股扩展】:数据增强

课程来源:人工智能实践:Tensorflow笔记2 文章目录前言TensorFlow2数据增强函数数据增强网络八股代码:总结前言 本讲目标:数据增强,增大数据量 关于我们为何要使用数据增强以及常用的几种数据增强的手法,可以看看下面的文章&#…

C++:从C继承的标准库

C从C继承了的标准库 &#xff0c; 这就意味着 C 中 可以使用的标准库函数 在C 中都可以使用 &#xff0c; 但是需要注意的是 &#xff0c; 这些标准库函数在C中不再以 <xxx.h> 命名 &#xff0c; 而是变成了 <cxxx> 。 例如 &#xff1a; 在C中操作字符串的…

分享WCF聊天程序--WCFChat

无意中在一个国外的站点下到了一个利用WCF实现聊天的程序&#xff0c;作者是&#xff1a;Nikola Paljetak。研究了一下&#xff0c;自己做了测试和部分修改&#xff0c;感觉还不错&#xff0c;分享给大家。先来看下运行效果&#xff1a;开启服务&#xff1a;客户端程序&#xf…

c# uri.host_C#| 具有示例的Uri.Equality()运算符

c# uri.hostUri.Equality()运算符 (Uri.Equality() Operator) Uri.Equality() Operator is overloaded which is used to compare two Uri objects. It returns true if two Uri objects contain the same Uri otherwise it returns false. Uri.Equality()运算符已重载&#xf…

第六章至第九章的单元测试

1,‌助剂与纤维作用力大于纤维分子之间的作用力,则该助剂最好用作() 纤维增塑膨化剂。 2,助剂扩散速率快,优先占领纤维上的染座,但助剂与纤维之间作用力小于染料与纤维之间作用力,该助剂可以作为() 匀染剂。 3,助剂占领纤维上的染座,但助剂与纤维之间作用力大于染…

【神经网络扩展】:断点续训和参数提取

课程来源&#xff1a;人工智能实践:Tensorflow笔记2 文章目录前言断点续训主要步骤参数提取主要步骤总结前言 本讲目标:断点续训&#xff0c;存取最优模型&#xff1b;保存可训练参数至文本 断点续训主要步骤 读取模型&#xff1a; 先定义出存放模型的路径和文件名&#xff0…

开发DBA(APPLICATION DBA)的重要性

开发DBA是干什么的&#xff1f; 1. 审核开发人员写的SQL&#xff0c;并且纠正存在性能问题的SQL ---非常重要 2. 编写复杂业务逻辑SQL&#xff0c;因为复杂业务逻辑SQL开发人员写出的SQL基本上都是有性能问题的&#xff0c;与其让开发人员写&#xff0c;不如DBA自己写。---非常…

javascript和var之间的区别?

You can define your variables in JavaScript using two keywords - the let keyword and the var keyword. The var keyword is the oldest way of defining and declaring variables in JavaScript whereas the let is fairly new and was introduced by ES15. 您可以使用两…