39. 【Android教程】触摸事件分发

用户在使用 Andriod 系统的时候会不断的和我们的 App 进行各种类型的交互(类似点击、滑动等等),“事件”就是一个非常有效的用来收集用户行为的方式。在前面章节有提到过:Android 系统采用一个先进先出(FIFO)队列来维护一个事件 List。在每个事件出列的时候,Android 系统会根据一定的规则对这些事件做分发,我们可以通过接收这些事件来对用户的操作进行相应的处理。

1. 事件处理相关概念

  • Event Listeners Registration:
    事件监听器注册。在接收事件之前完成注册,目的是告诉系统当前需要监听某个事件,从而在事件触发的时候系统会回调已注册接口中的方法。

  • Event Listeners:
    事件监听器。顾名思义,当某个事件被用户行为触发的时候,系统会回调所有已注册相应事件监听器的回调方法,从而完成事件的分发。

  • Event Handlers:
    事件处理。当事件发生时,系统会回调我们注册过的接口,所以可以在回调方法中对事件进行处理

2. 触摸事件类型

一次完整的触摸事件是从手指触摸屏幕一直到离开屏幕,这个过程可能非常短暂,但是对于 Android 系统而言发生了很多状态的切换,常用的主要有以下几种:

  • ACTION_DOWN:
    手指刚接触到的状态
  • ACTION_POINTER_DOWN:
    在第一个状态之后其他的点发生了触摸
  • ACTION_MOVE:
    手指触摸滑动
  • ACTION_POINTER_UP:
    除了第一个触摸点以外的触摸点离开屏幕
  • ACTION_UP:
    第一个接触的点离开屏幕
  • ACTION_CANCEL:
    滑动时移动到无效区域

3. 触摸事件监听方法

3.1 注册触摸监听器

为了能够顺利接收到以上事件,并进行相应处理,我们需要在事件发生之前完成注册,方法如下:

public boolean onTouchEvent(MotionEvent ev){switch(ev.getAction()){case MotionEvent.ACTION_DOWN:{break;}case MotionEvent.ACTION_MOVE:{break;}return true;}
}

3.2 获取触摸坐标

在接收到各个状态的事件之后,我们需要从中获取当前的触摸/滑动坐标,如下:

float x = ev.getX();
float y = ev.getY();

4. 触摸事件示例

在实际开发中,大多数时候我们需要监听的是DOWNMOVE以及UP三个事件,我们可以在DOWN事件中获取到触摸的起点,然后在MOVE过程中获取并不断追踪用户的滑动坐标,最后在UP事件中获取终点进而结束本次 Touch 事件。

4.1 布局文件

首先编写布局文件,我们需要 4 个 TextView,分别用来显示触摸起点的 X 轴、Y 轴坐标,以及滑动时的 X 轴、Y 轴偏移量,最后创建一个 View 用作触摸事件的接收源。内容非常简单,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="20dp"android:transitionGroup="true"tools:context=".MainActivity"><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:text="Android 事件处理"android:textSize="35dp" /><TextViewandroid:id="@+id/down_x"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/title"android:layout_alignStart="@+id/title"android:layout_marginTop="30dp"android:hint="点击的X轴坐标"android:textColor="@color/colorPrimary" /><TextViewandroid:id="@+id/down_y"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/down_x"android:layout_alignStart="@+id/down_x"android:layout_marginTop="10dp"android:hint="点击的Y轴坐标"android:textColor="@color/colorPrimary" /><TextViewandroid:id="@+id/move_x"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/down_y"android:layout_alignStart="@+id/down_y"android:layout_marginTop="60dp"android:hint="移动位置的X轴坐标"android:textColor="@color/colorPrimaryDark" /><TextViewandroid:id="@+id/move_y"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/move_x"android:layout_alignStart="@+id/move_x"android:hint="移动位置的Y轴坐标"android:textColor="@color/colorPrimaryDark" /><TextViewandroid:id="@+id/touch"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:text="点我开始滑动"android:textColor="#ff5480ff"android:textSize="35sp" />
</RelativeLayout>

4.2 触摸事件的注册、监听以及处理

在 MainActivity 中我们对 id 为 touch 的 TextView 注册触摸监听器,然后在DOWN中获取触摸起点,并写在对应的 TextView 中;随后在MOVE中实时获取滑动偏移量,也在对应的 TextView 中进行实时更新,代码如下:


package com.emercy.myapplication;import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;public class MainActivity extends Activity {float xAxis = 0f;float yAxis = 0f;float downXAxis = 0f;float downYAxis = 0f;TextView downX, downY, moveX, moveY;TextView touch;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);downX = findViewById(R.id.down_x);downY = findViewById(R.id.down_y);moveX = findViewById(R.id.move_x);moveY = findViewById(R.id.move_y);touch = findViewById(R.id.touch);// 1、注册触摸监听器touch.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {final int actionPeformed = event.getAction();// 2、判断当前触摸状态switch (actionPeformed) {case MotionEvent.ACTION_DOWN: {// 3、在不同状态中进行触摸事件处理downXAxis = event.getX();downYAxis = event.getY();downX.setText("按下的位置横坐标:" + downXAxis);downY.setText("按下的位置纵坐标:" + downYAxis);break;}case MotionEvent.ACTION_MOVE: {final float x = event.getX();final float y = event.getY();final float dx = x - downXAxis;final float dy = y - downYAxis;xAxis += dx;yAxis += dy;moveX.setText("移动距离的横坐标:" + xAxis);moveY.setText("移动距离的纵坐标:" + yAxis);break;}}return true;}});}
}

编译运行,效果如下:

触摸左下角的“点我开始滑动”,当前触摸的坐标就会在 TextView 中展示了,然后滑动手指,随着滑动的偏移量的变化,也会在 TextView 中进行同步更新。

5. 小结

本节讲解了触摸事件的分发处理方式,首先介绍了事件处理的几个常用概念及一次触摸事件中切换的几种状态,然后讲述了触摸事件处理的几个重要方法,最后用一个完整例子演示了触摸事件的监听处理。这个是继onClick()事件后最常用的一个事件,也是绝大多数事件分发的基础事件,因为各种交互事件都是从触摸开始的,所以大家即使用的不多也一定要掌握使用方法及其中的基本原理。

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

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

相关文章

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

54、图论-实现Trie前缀树

思路&#xff1a; 主要是构建一个trie前缀树结构。如果构建呢&#xff1f;看题意&#xff0c;应该当前节点对象下有几个属性&#xff1a; 1、next节点数组 2、是否为结尾 3、当前值 代码如下&#xff1a; class Trie {class Node {boolean end;Node[] nexts;public Node(…

如何在PostgreSQL中使用索引覆盖扫描提高查询性能?

文章目录 解决方案1. 创建合适的索引2. 确保查询能够使用索引覆盖扫描3. 调整查询以利用索引覆盖扫描4. 监控和调优 示例代码1. 创建索引2. 编写查询3. 检查是否使用索引覆盖扫描4. 调整索引 总结 在PostgreSQL中&#xff0c;索引是提高查询性能的关键工具之一。索引允许数据库…

文章生成器免费版有哪些,哪个好用?

作为一个长期需要写作的人&#xff0c;对文章生成器自然是非常了解&#xff0c;如果搜文章生成器互联网上多到让人应接不暇&#xff0c;但小编今天要谈的是文章生成器免费版&#xff0c;因为看到很多写手朋友都想找一个免费的文章生成器来用&#xff0c;但是大家在网上搜可能很…

GITHUB的VB代码无法加载的问题解决

GITHUB里有不少好的VB代码&#xff0c;但是下载之后&#xff0c;经常出现工程加载出错的问题&#xff0c;例如&#xff1a; LOG文件为&#xff1a; 不能加载 0 行 0: 不能加载文件 D:\xxxx\Semi VB API Loader\frmMain.frm 。 原因其实很简单&#xff0c;github里的换行符是u…

Promise.all 的方法还没执行完就执行了.then

碰见一个问题&#xff0c;接盘了一个有问题的页面修改。 改变日期后 查询很多数据再去重新加载页面上的数据显示相关的组件。 问题就来了。 加载异常捏…… 最后我一通查&#xff1a; 重点来了 是因为这个Promise.all(数组)&#xff0c;里边这个数组的问题。现在是在数据中…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

Linux - tar (tape archive)

tar 的全称是 Tape Archive。它最初是在 Unix 系统中用于将数据写入磁带的工具&#xff0c;但现在它通常用于创建、维护、修改和提取文件的归档文件。尽管 tar 可以用于压缩和解压缩文件&#xff0c;但它本身并不进行压缩&#xff0c;而是通常与 gzip 或 bzip2 等压缩工具一起使…

【圆桌论坛】个人作为嘉宾参与问答环节的总结,Create 2024百度AI开发者大会之AI智能体开发与应用论坛

目录 ⭐前言⭐讨论话题✨本质和价值✨端侧部署✨应用商业模式✨商业模式 ⭐主题总结⭐有趣分享 ⭐前言 首先&#xff0c;非常荣幸和开心作为开发者和创业者代表参加百度Create AI大会分论坛圆桌论坛的问答环节。 在分论坛活动开始前&#xff0c;参加了文心智能体平台&#xff…

vi编辑器的用法linux中的vim编辑器大全

vim的介绍 vi 和 vim 命令是linux中强⼤的⽂本编辑器, 由于Linux系统⼀切皆⽂件&#xff0c;⽽配置⼀个服务就是在修改其配置⽂件的参数。 vim 编辑器是运维⼯程师必须掌握的⼀个⼯具, 没有它很多⼯作都⽆法完成。 其中有vi和vim两种 vi和vim的区别 Vim是Vi的升级版本&#…

【QT学习】9.绘图,三种贴图,贴图的转换

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

【Linux】学习记录_14_线程

14 线程 14.1 线程和进程 进程是资源管理的最小单位&#xff0c;每个进程都有数据段、代码段和堆栈段&#xff0c;进程切换时都有复杂的上下文切换等动作。进程切换上下文时&#xff0c; 需要重新映射虚拟地址空间、进出OS内核、寄存器切换&#xff0c;还会干扰处理器的缓存机…

11408知识点集合

文章目录 一、数学(一) 高数0.初等数学补充1.函数、极限、连续2.导数3.中值定理4.积分5.微分方程6.空间解析几何7.多元微分8.重积分9.曲线曲面积分10.无穷级数11.其他杂记(二) 线代0.串联各章的等价条件1.行列式、矩阵的秩、矩阵的初等变换2.向量3.方程组、矩阵方程AXB4.特征值…

第G8周:ACGAN任务

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 参考论文 这周主要任务就是根据之前GAN&#xff0c;CGAN&#xff0c;SGAN网络架构搭建…

python_django中小学家校互动系统vue_flask家校联系

实现了一个完整的家校互动系统&#xff0c;其中主要有作业信息模块、学校管理员模块、学生学籍模块、学生成绩模块、学科模块、系统新闻模块、系统公告模块、校内新闻模块、校内公告模块、用户表模块、token表模块、关于我们模块、收藏表模块、年级模块、家长模块、教师模块、互…

Spark Standalone模式部署

准备至少2台虚拟机&#xff0c;装好linux系统&#xff0c;我装的是Ubuntu20.04。 1.修改主机名&#xff08;每台&#xff09; 1&#xff09;修改/etc/hostsname内容&#xff0c;主节点改为master&#xff0c;子节点改为slaver1 sudo vim /etc/hostname 2&#xff09;在/etc/…

如何通过外发文件控制,保障企业对核心业务数据的控制力?

外发文件控制是企业数据安全管理的重要组成部分&#xff0c;它涉及到对从企业内网向外发送的文件进行严格控制和管理&#xff0c;以防止敏感或机密信息的泄露。以下是常见的一些外发手段及问题&#xff1a; &#xff08;1&#xff09;IM通讯工具 如微信、QQ、企业微信、钉钉、…

如何通过文件外发管理系统,保护企业机密数据不外泄?

在互联网时代&#xff0c;企业与外界进行频繁的信息沟通已成为必要的一种业务模式&#xff0c;而在交互的过程中很可能会涉及到企业的相关敏感信息&#xff0c;一旦不慎流出就将会面临失控的风险。像员工在掌握了公司的关键信息后另起炉灶&#xff0c;设立同类型公司&#xff0…

每个开发人员都应该知道的13个Nodejs库

Node.js&#xff0c;作为一种广受推崇的后端JavaScript环境&#xff0c;已成为众多网络开发者的首选。它不仅位列全球最流行编程语言之一&#xff0c;还通过JavaScript库的代码复用功能&#xff0c;极大地提升了项目开发效率。然而&#xff0c;面对众多选项&#xff0c;挑选合适…

ArrayList与顺序表(2)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…