【知识梳理1】Android触摸事件机制

前言

随着科学技术的发展,智能手机早已成为我们当代人身边不可缺少的“伙伴”之中的一个,堪比对象女友。每天我们对着手机反复的做着点击滑动操作,而手机则随着我们的操作给我们展示她的精彩。



废话到此结束。

看到这里,即使不是作为移动端码农的你也应该知道触摸事件对手机(经典键盘机除外)的重要性了。

什么是触摸事件

顾名思义。就是触摸手机屏幕后产生的事件。这时候请你拿出手机。点击屏幕中的某个按钮(不要松手),移动一段距离。松手。
这个过程通常会产生例如以下几个事件:

  1. 点击(Down)事件
  2. 移动(Move)事件
  3. 松手(Up)事件

Android为我们封装好了一个触摸事件类MotionEvent,上述的三个过程分别相应着MotionEvent中的MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVEMotionEvent.ACTION_UP事件类型,我们能够以此来实现不同的逻辑,即事件的分发处理。所谓触摸事件的分发,实际上能够理解为MotionEvent事件的分发过程,即当一个MotionEvent产生了之后,系统须要把这个事件传递给一个详细的View,而这个传递的过程就是分发过程。

事件三剑客

一般事件的分发过程是由事件三剑客(方法)来共同完毕的。

/*** 剑客一:用于事件的分发*/
public boolean dispathTouchEvent(MotionEvent ev)/*** 剑客二:在剑客一中被调用,用于事件的拦截*/ 
public boolean onInterceptTouchEvent(MotionEvent ev)/*** 剑客三:在剑客一中被调用。处理点击事件。true:消耗了当前事件  false:当前view无* 法再次接收事件*/ 
public boolean onTouchEvent()(MotionEvent ev)

三剑客的关系例如以下图所看到的(以Activity的dispathTouchEvent为例)

分析可知:
1. 触摸事件ev类收到点击的ACTION,会回调onUserInteraction方法,一般项目中我们把一些须要用户開始触摸时就须要执行的任务代码放在这里。
2. 接下来触摸事件ev会传递给Activity窗体绑定的根视图rootView(View/ViewGroup)。如果根视图也有子视图。事件ev会一级一级的分发下去,如果在这个过程中ev被消耗了,事件就此结束分发,否则进入步奏3。
3. 全部的视图布局都没有消耗掉ev事件。就会调用Activity的onTouchEvent()方法。以下会详细讲诉。

Android界面简析

在详细讲诉前,我们先来了解下的android的界面架构。如果说手机是一个学校,那么手机中的每一个APP(应用)都是学校里的一道道独特风景,正是它们,构成了学校的魅力。而每一个APP都是由一个个Activity组成的。



还是在说废话…

例如以下图所看到的,我们清晰的看到每一个Activity都会包括一个Window对象。而window对象通常由PhoneWindow来实现。

PhoneWindow将一个DecorView设置为整个应用窗体的根View。它将屏幕分成两部分。一个是TitleView。还有一个是ContentView(也就是大家熟悉的ContentView布局)。

ContentView是一个ID为contentFrameLayout,而我们一直写的activity_xx.xml布局就是设置在这样一个FrameLayout里。
3-1
DecorView将要显示的详细内容呈如今了PhoneWindow上。这里面的全部View的监听事件(点击、滑动等操作)都通过一个名为WindowManagerService来进行接收(详细可看深入理解android卷三),并通过Activity来回调相应的监听。


为了让大家更好的理解。我们来写一个小demo例如以下

执行结果如图

小场景。见真理

场景一

我们写一个最简单的demo例如以下

执行程序,点击button,看到log输出例如以下:

改动dispathTouchEvent,直接return false
执行程序,点击button,是不是看到控制台什么都没有输出。可见事件传递到activity的根视图就被结束分发了。以下已场景二来详细探究下这个过程。

场景二

假如在大学中。学校交给了数学老师一个任务。老师讲这项任务布置给了女班长。而女班长又将这个任务交给了帅气的我。我千辛万苦的将这个任务完毕了,然后交给了女班长,女班长认为完毕的不错,夸了帅气的我几句(暗恋上了),然后将任务提交给了老师,老师看了下也认为完毕的不错,就把任务提交给学校了。
根据上面的场景,我们设计一个场景实比例如以下

  1. 老师——TeacherViewGroup
  2. 女班长——MonitressViewGroup
  3. 帅气的我——HandsomeMyView

布局层次例如以下图所看到的

TeacherViewGroup和MonitressViewGroup代码例如以下。重写了三剑客方法

HandsomeMyView代码例如以下,view是没有剑客2(方法)onInterceptTouchEvent()

点击帅气的我能够看见log打印例如以下

能够看见一般事件都有两个过程

  • 传递过程 : 老师(TeacherViewGroup)——>女班长(MonitressViewGroup)——>帅气的我(HandsomeMyView)
  • 处理过程 : 帅气的我(HandsomeMyView)——>女班长(MonitressViewGroup)——>老师(TeacherViewGroup)

传递的过程方法:剑客1(dispatchTouchEvent)、剑客2(onInterceptTouchEvent)
处理的过程方法:剑客3(onTouchEvent)

为了让大家更好的理解。整理视图例如以下:

从中我们看出触摸事件ev会依照子View增加ViewGroup先后顺序相反的顺序。依次有机会去消费此触摸事件ev。即最后增加的最先有机会消费此触摸事件(消费的前提是,触摸点在这个子View的视图范围之内)。简而言之,传递由外向内,消费(处理)由内向外。

在前面的事件三剑客中细心的同学会发现,他们的返回值都是boolean类型,那么true和false分别代表什么意义呢?
在这里我先告诉大家结论,然后在验证这个结论:

dispatchTouchEvent()onInterceptTouchEvent()

  • 返回true表示事件被拦截。不继续。
  • 返回false表示事件不被拦截,继续下一步流程。

onTouchEvent()

  • 返回true表示事件被处理了,不用传递给上一级视图;
  • 返回false表示事件交给上一级视图处理;

初始情况下他们的默认返回值都为false

拦截onInterceptTouchEvent()

如果女班长暗恋帅气的我,自己偷偷帮我完毕了任务,这时候事件就被女班长(MonitressViewGroup)的onInterceptTouchEvent()方法拦截了,即MonitressViewGrouponInterceptTouchEvent()返回ture,此时Log输出例如以下

整理视图例如以下:

相同的,也能够如果老师人比較好,不忍心麻烦学生。自己处理了。这个过程相似女班好处理过程。

到这里,我想大家对事件的分发、拦截已经有一个比較清晰的认识了。接下来我们来看下事件的处理。

处理onTouchEvent()

我们处理完任务后是须要将完毕结果汇报给上级的。也就是帅气的我须要向我亲爱的女班长汇报结果。班长向老师汇报结果。如果我不能按时完毕任务。没将任务结果汇报给女班长。也就是HandsomeMyView的onTouchEvent()方法返回true(事件被处理了。不用返回给上级),此时Log输出例如以下。女班长和老师不用继续处理事件了

整理视图例如以下:

相同的,女班长和老师也能够不像他们各自的上级汇报。过程相似帅气的我(HandsomeMyView)。

Ref

  1. Mastering the Android Touch System
  2. Android群英传

转载于:https://www.cnblogs.com/llguanli/p/8515389.html

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

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

相关文章

自己做的一个登录页面,纯代码!

先上效果图吧. 本人菜鸟入门, 请勿喷. 首先样式: 1 1 body{2 2 margin: 0;3 3 padding: 0;4 4 width: 100%;5 5 height: 100%;6 6 }7 7 8 8 .headers{9 9 width: 100%;10 10 height: 100px;11 11 }12 12 .siv-ng{13 13 width:…

ASP.NET调用cmd命令提示符拒绝访问解决方案

using System.Diagnostics; public class CmdHelper{private static string CmdPath "C:\Windows\System32\cmd.exe";/// <summary>/// 执行cmd命令/// 多命令请使用批处理命令连接符&#xff1a;/// <![CDATA[/// &:同时执行两个命令/// |:将上一个命…

Some reading, some thinking.

update&#xff1a;感谢助教0 0又学会一招&#xff0c;play 了一下CSS Part 1 Reading AuthorArticleNoteMadcola《两年波折路&#xff08;考研、工作、考研&#xff09;》"吾志所向&#xff0c;一往无前&#xff1b;愈挫愈奋&#xff0c;再接再励。"辜新星《时刻调…

CSS选择器:伪类(图文详解)

本文最初发表于博客园&#xff0c;并在GitHub上持续更新前端的系列文章。欢迎在GitHub上关注我&#xff0c;一起入门和进阶前端。 以下是正文。 伪类&#xff08;伪类选择器&#xff09; 伪类&#xff1a;同一个标签&#xff0c;根据其不同的种状态&#xff0c;有不同的样式。…

DIV固定宽度和动态拉伸混合水平排列

1.效果图 2.源代码 html <h2>1.头部固定&#xff0c;尾部拉伸</h2> <div class"container" id"div1"><div class"head"></div><div class"tail"></div> </div><h2>2.尾部固定…

使用CSS设置JavaFX饼图样式

渲染图表时&#xff0c; JavaFX默认提供某些颜色。 但是&#xff0c;在某些情况下&#xff0c;您想自定义这些颜色。 在此博客文章中&#xff0c;我将使用一个示例来更改JavaFX饼图的颜色&#xff0c;该示例打算在今天下午在RMOUG Training Days 2013的演示中包括。一些基于Jav…

java 错误: 找不到或无法加载主类

这个问题应该很常见的&#xff0c;笔者经常手工编译一些测试代码或者小工具&#xff0c;经常用到 javac和java来编译并运行一些简单的小工具。 以Hello World来测试。 HelloWorld.java public class HelloWorld{public static void main(String[]args){System.out.println(&quo…

在Visual Studio Code中配置GO开发环境

一、GO语言安装 详情查看&#xff1a;GO语言下载、安装、配置 二、GoLang插件介绍 对于Visual Studio Code开发工具&#xff0c;有一款优秀的GoLang插件&#xff0c;它的主页为&#xff1a;https://github.com/microsoft/vscode-go 这款插件的特性包括&#xff1a; Colorizatio…

最受欢迎的应用服务器

这是本系列的第二篇文章&#xff0c;我们将发布有关Java安装的统计数据。 使用的数据集来自免费的Plumbr安装&#xff0c;在过去六个月中&#xff0c;我们总共收集了1,024个不同的环境。 本系列的第一篇文章分析了基础-运行JVM的操作系统&#xff0c;是32位还是62位基础架构以…

SON_EXAM考试php,通用全国少儿英语等级考试:三星笔试真题

单项选择&#xff1a;36. exciting the game was! I enjoyed every minute of it.A.What B. How C.What an B.How an37.You stay here if youve finished your work.A.neednt B.mustnt C. shouldnt D.cant38 Nanjing Road in Shanghai is always crowded peole.A.with B.by c.o…

CSS基础知识(display和visibility、overflow、文档流)

9、显示与隐藏 u display属性&#xff1a; (1)none&#xff1a;隐藏元素&#xff0c;不会再占有页面的任何空间&#xff0c;即不会影响布局。 (2)inline&#xff1a;默认值。将元素[显示]为内联元素 &#xff08;与HTML元素本身无关系&#xff09; (3)block&#xff1a…

最受欢迎的Java环境

该职位将是即将发布的系列文章中的第一篇。 我们从所使用的环境开始&#xff1a;如果您感兴趣的是最受欢迎的JVM供应商或JVM版本&#xff0c;那么32bit是比64bit更流行的体系结构&#xff0c;还是Windows 8比Windows XP更流行的体系结构-这些都将在我们的文章中介绍。 在下一个…

使用宏实现透视表部分功能,将AB列数据合并统计.

功能:1.筛选B列;2.将A列中的值按照筛选后的结果进行合计. 这个特殊点是按照月日进行筛选的. Sub count_a() Dim sh As Worksheet Set sh ActiveSheet Range("C2:D" & [D65536].End(3).Row).Clear For line_b 2 To [B65536].End(3).Row If Len(Cells(line_b, &q…

HTML基础知识(常见元素、列表、链接元素、图片元素)

1、HTML有关概念 全称: Hyper Text Markup Language&#xff08;超文本标记语言&#xff09; 其文件扩展名为“.html”或“.htm” * 超文本 - 在普通的文本基础上&#xff0c;添加超链接、图片、音频或视频等 * 标记 - 标记就是HTML中的标签(元素)&#xff0c;特点:<a> …

权限和ACL练习题

1、在/testdir/dir里创建的新文件自动属于g1组&#xff0c;组 g2的成员如&#xff1a;alice能对这些新文件有读写权限&#xff0c;组g3 的成员如&#xff1a;tom只能对新文件有读权限&#xff0c;其它用户&#xff08;不 属于g1,g2,g3&#xff09;不能访问这个文件夹。 前期准备…

CSS3的过渡和转换

CSS3的过渡和转换 1.过渡 什么是过渡呢&#xff1f;过渡通俗的来说就是从一个样式到另一个样式的逐渐转换改变的效果。 过渡的属性&#xff1a; 属性 描述csstransition简写属性&#xff0c;用于在一个属性中设置4个过渡属性3transition-property规定应用过渡的css属性的名称…

JavaEE概念简介

这篇文章旨在澄清J2EE范例中使用的首字母缩写词和概念。 J2EE代表Java to Platform&#xff0c;Entreprise Edition。 它使创建模块化Java应用程序成为可能&#xff0c;并将其部署在应用程序服务器上。 它依赖于Java SE&#xff0c;Java SE是一组Java库的核心&#xff0c;所有J…

js php 数据类型判断,【js基础】变量类型判断

类型判断方法比较&#xff1a;如果需要想详细了解&#xff0c;请看下文:注&#xff1a;原封不动复制备份&#xff0c;防止删帖在JavaScript中&#xff0c;有5种基本数据类型和1种复杂数据类型&#xff0c;基本数据类型有&#xff1a;Undefined, Null, Boolean, Number和String&…

HTML阻止iframe跳转页面并使用iframe在页面内嵌微信网页版

昨天看到这篇文章[置顶]开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面 就想弄一个winform结合html5的一个小东西&#xff0c;突有兴致&#xff0c;想在里面嵌套一个微信网页版。 好了&#xff0c;想法一出来&#xff0c;就行动吧&#xff0c;最终效果…

标准模板库(STL)学习指南之set集合

set是关联容器。其键值就是实值&#xff0c;实值就是键值&#xff0c;不可以有重复&#xff0c;所以我们不能通过set的迭代器来改变set的元素的值&#xff0c;set拥有和list相同的特性&#xff1a;当对他进行插入和删除操作的时候&#xff0c;操作之前的迭代器依然有效。当然删…