Android事件拦截(一)——触摸事件MotionEvent分析

article/2025/9/14 14:28:43

(1)MotionEvent相关动作事件

//按下动作
public static final int ACTION_DOWN = 0;
//抬起动作
public static final int ACTION_UP = 1;
//移动动作
public static final int ACTION_MOVE = 2;
//触摸取消动作
public static final int ACTION_CANCEL = 3;
//触摸动作超出边界
public static final int ACTION_OUTSIDE = 4;
//多点触摸按下动作
public static final int ACTION_POINTER_DOWN = 5;
//多点触摸离开动作
public static final int ACTION_POINTER_UP = 6;//动作掩码常量
public static final int ACTION_MASK = 255; //0x00ff
//索引掩码常量
public static final int ACTION_POINTER_INDEX_MASK = 65280; //0xff00
//右移8位的常量
public static final int ACTION_POINTER_INDEX_SHIFT = 8;//指针在窗口或者View区域移动,但没有按下
public static final int ACTION_HOVER_MOVE = 7;
//滚轮滚动
public static final int ACTION_SCROLL = 8;
//指针移入到窗口或者View区域,但没有按下
public static final int ACTION_HOVER_ENTER = 9;
//指针移出到窗口或者View区域,但没有按下
public static final int ACTION_HOVER_EXIT = 10;
//按下按钮
public static final int ACTION_BUTTON_PRESS = 11;
//释放按钮
public static final int ACTION_BUTTON_RELEASE = 12;
//...
//获取触控动作比如ACTION_DOWN
event.getAction() 
//获取触控点的数量,比如2则可能是两个手指同时按压屏幕event.getPointerCount(); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引event.getPointerId(nID);//按下开始时间 event.getDownTime();// 事件结束时间
event.getEventTime();
//总共按下时花费时间
event.getEventTime()-event.getDownTime()); 

代码Demo

final int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;String action = null;@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:action = "ACTION_DOWN";break;case MotionEvent.ACTION_UP:action = "ACTION_UP";break;case MotionEvent.ACTION_MOVE:action = "ACTION_MOVE";break;case MotionEvent.ACTION_CANCEL:action = "ACTION_CANCEL";break;case MotionEvent.ACTION_OUTSIDE:action = "ACTION_OUTSIDE";break;case MotionEvent.ACTION_POINTER_DOWN:action = "ACTION_POINTER_DOWN";break;case MotionEvent.ACTION_POINTER_UP:action = "ACTION_POINTER_UP";break;case MotionEvent.ACTION_HOVER_MOVE:action = "ACTION_HOVER_MOVE";break;case MotionEvent.ACTION_SCROLL:action = "ACTION_SCROLL";break;}Log.e("onTouchEvent", "PointerCount = "+ event.getPointerCount() + ", Time = " + (event.getEventTime() - event.getDownTime())+ ", action = " + action);return super.onTouchEvent(event);}
E/onTouchEvent: PointerCount = 1, Time = 0, action = ACTION_DOWN
E/onTouchEvent: PointerCount = 2, Time = 0, action = ACTION_POINTER_DOWN
E/onTouchEvent: PointerCount = 3, Time = 0, action = ACTION_POINTER_DOWN
E/onTouchEvent: PointerCount = 3, Time = 725, action = ACTION_POINTER_UP
E/onTouchEvent: PointerCount = 2, Time = 742, action = ACTION_POINTER_UP
E/onTouchEvent: PointerCount = 1, Time = 742, action = ACTION_UP

(2)获取坐标值和相对距离等方法

在这里插入图片描述

//表示的是当前控件的宽度,即getRight()-getLeft()
View.getWidth()
//表示的是当前控件的高度,即getBottom()-getTop()
View.getHeight()//子View的顶部到父View顶部的距离
View.getTop()
//子View的右边界到父View的左边界的距离
View.getRight()
//子View的底部到父View的顶部的距离
View.getBottom()
//子View的左边界到父View的左边界的距离 
View.getLeft()//计算的是该View在X轴的偏移量。初始值为0,向左偏移值为负,向右偏移值为正
View.getTranslationX()
//计算的是该View在Y轴的偏移量。初始值为0,向上偏移为负,向下偏移为证
View.getTranslationY()//表示的是触摸的点距离自身左边界的距离
event.getX()
//表示的是触摸的点距离自身上边界的距离
event.getY()
//表示的是触摸点距离屏幕左边界的距离
event.getRawX()
//表示的是触摸点距离屏幕上边界的距离
event.getRawY()

代码Demo

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="500dp"android:orientation="vertical"android:background="#00FF00"android:gravity="center"><RelativeLayoutandroid:id="@+id/center_layout"android:layout_width="300dp"android:layout_height="300dp"android:background="#FF0000"></RelativeLayout></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

在这里插入图片描述

//获取屏幕相关参数
private void getScreenParams() {DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int heightPixels = dm.heightPixels;//高的像素int widthPixels = dm.widthPixels;//宽的像素int densityDpi = dm.densityDpi;//dpifloat density = dm.density;//density=dpi/160,密度比float xdpi = dm.xdpi;//xdpifloat ydpi = dm.ydpi;//ydpifloat scaledDensity = dm.scaledDensity;//scaledDensity=dpi/160 字体缩放密度比float heightDP = heightPixels / density;//高度的dpfloat widthDP = widthPixels / density;//宽度的dpString str = "\nwidthPixels: " + widthPixels + "px";str += "\nheightPixels: " + heightPixels + "px";str += "\ndensityDpi: " + densityDpi + "dpi";str += "\ndensity: " + density;str += "\nxdpi: " + xdpi + "dpi";str += "\nydpi: " + ydpi + "dpi";str += "\nscaledDensity: " + scaledDensity;str += "\nheightDP: " + heightDP + "dp";str += "\nwidthDP: " + widthDP + "dp";Log.e("ScreenParams", "ScreenParams = " + str);}
mCenterLayout = findViewById(R.id.center_layout);mCenterLayout.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {Log.e("onTouch", "width = " + view.getWidth() + ", height = " + view.getHeight()+ ", measuredWidth = " + view.getMeasuredWidth() + ", measuredHeight = " + view.getMeasuredHeight());Log.e("onTouch", "left = " + view.getLeft() + ", top = " + view.getTop()+ ", right = " + view.getRight() + ", bottom = " + view.getBottom()+ ", translationX = " + view.getTranslationX() + ", translationY = " + view.getTranslationY());Log.e("onTouch", "X = " + event.getX() + ", Y = " + event.getY() +", RawX = " + event.getRawX() + ", RawY = " + event.getRawY());return false;}});
//wm size = 720x1440
E/ScreenParams: ScreenParams = widthPixels: 720pxheightPixels: 1344pxdensityDpi: 320dpidensity: 2.0xdpi: 281.353dpiydpi: 283.534dpiscaledDensity: 2.0heightDP: 672.0dpwidthDP: 360.0dp//获取的数据为pixel显示
E/onTouch: width = 600, height = 600, measuredWidth = 600, measuredHeight = 600
E/onTouch: left = 60, top = 200, right = 660, bottom = 800, translationX = 0.0, translationY = 0.0
E/onTouch: X = 109.76422, Y = 31.952667, RawX = 169.76422, RawY = 391.95267

从Log可以看出,获得的数据完全符合上图所示的距离。


http://chatgpt.dhexx.cn/article/c4ndURoe.shtml

相关文章

Android MotionEvent

1.MotionEvent Android将所有的输入事件都放在了 MotionEvent 中&#xff0c;MotionEvent 负责集中处理所有类型设备的输入事件&#xff0c;包括单点触控、手势、多点触控、触控笔、鼠标、键盘、操纵杆、游戏控制器等。 事件类型&#xff1a; MotionEvent的事件类型主要有&…

[Android]视图的控触操作-MotionEvent

引入 对屏幕的任何操作&#xff0c;系统都会创建一个触摸事件的对象MotionEvent来应对这个操作。当点击手机屏幕的某一个视图时&#xff0c;最先感应到的是屏幕&#xff0c;因为Activity系统是分层的结构&#xff0c;底层是一些驱动&#xff0c;所以驱动就会得到信息并且把信息…

MotionEvent 详解

Android MotionEvent详解: https://www.jianshu.com/p/0c863bbde8eb https://www.diycode.cc/topics/392 Android 将所有的输入事件都放在了 MotionEvent 中&#xff0c;随着安卓的不断发展壮大&#xff0c;MotionEvent 也开始变得越来越复杂&#xff0c;下面是我自己整理的 …

MotionLayout MotionScene 动画从未如此简单!

话不多说先上图。 这是要做的最终效果。通过这些动画我们将了解MotionLayout的使用方法和常用的一些属性。 第一步&#xff1a;添加依赖 如果要使用MotionLayout请将ConstraintLayout更新到2.0及以上。在build.gradle文件中添加依赖 如果使用的是AndroidX&#xff0c;添加依赖…

Android的MotionEvent和事件处理

之前几篇文章我们讲解了自定义View和ViewGroup, 今天我们来看下View和ViewGroup常见的触摸事件和按键事件。 MotionEvent MotionEvent对象是与用户触摸相关的时间序列&#xff0c;该序列从用户首次触摸屏幕开始&#xff0c;经历手指在屏幕表面的任何移动&#xff0c;直到手指…

MotionEvent详解

Android MotionEvent 详解&#xff0c;之前用了两篇文章 事件分发机制原理 和 事件分发机制详解 来讲解事件分发&#xff0c;而作为事件分发主角之一的 MotionEvent 并没有过多的说明&#xff0c;本文就带大家了解 MotionEvent 的相关内容&#xff0c;简要介绍触摸事件&#xf…

Android自定义View进阶-MotionEvent详解

欢迎Follow我的GitHub, 关注我的CSDN. 其余参考Android目录 我们微信公众号&#xff1a;杨守乐 推荐文章&#xff1a; 如果你喜欢上了一个程序员小伙&#xff0c;献给所有的程序员女友 学习资料&#xff08;干货汇集&#xff09;不断更新【更新于2017-2-25】 Android Studi…

常用awk命令整理

AWK倾向于一行一行的数据进行处理 awk 用法&#xff1a;awk pattern {action} 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符&#xff0c;默认为一个空格 RS 输入记录分隔符 NF 当…

sed命令和awk命令

sed命令 sed命令■什么是sed■sed的工作流程■命令格式■常用选项:■常用操作:■打印内容■sed编辑器的寻址方式■删除行■替换■插入 awk命令■awk命令的工作原理■命令格式■常见的内建变量■按行输出文本■按字段输出文本:■通过管道、双引号调用Shell 命令■拓展 sed命令 …

awk命令应用

记录&#xff1a;353 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用awk文本处理工具处理文本&#xff1b;使用awk、cat和grep搭配使用处理文本&#xff1b;使用awk直接处理文本&#xff1b;使用shell脚本调用awk脚本处理文本。 版本&#xff1a; 操作系统&#x…

概要设计之功能模块

功能模块描述 所谓功能模块&#xff0c;从字面上理解&#xff0c;就是以功能来进行划分模块。 接着&#xff0c;根据功能特性多少&#xff0c;决定是否要划分“子功能模块”。 这里就容易出现一个问题&#xff0c;如何去确定每个功能的界限呢&#xff0c;以及很多人会拿用户角…

系统架构图编写(概要设计)

系统架构图编写&#xff08;概要设计&#xff09; 应用架构图、技术架构图、业务架构图定义以及到底怎么画好架构图&#xff1f; 常见的数据库架构设计方案&#xff1f; 业务架构的定义、特性和方法 架构图之间的关系 业务架构图 业务架构&#xff0c;是IT架构的基础。 是从业…

概要设计、详细设计:概念、方法、实践步骤

完整软件开发流程&#xff1a; 需求分析、概要设计、详细设计 一 1. 概念、方法、实践步骤 设计是指根据需求开发的结果&#xff0c;对产品的技术实现由粗到细进行设计的过程。根据设计粒度和目的的不同可以将设计分为概要设计、详细设计等阶段以便于管理和确保质量。设计内容…

概要设计与详细设计如何编写

撰写的设计文档主要分为&#xff1a;总体概要设计文档 详细设计文档&#xff0c;后简称为“概设”“详设”。 总设和详设都应该包含的部分&#xff1a; &#xff08;1&#xff09; 需求&#xff1a;一般以产品的语言描述&#xff0c;这一块可以拷贝产品需求文档中的story li…

软件项目总体设计

软件项目总体设计 目录 1.导言 1 1.1目的 1 1.2范围 1 1.3参考资料 2 2.项目设计原则简介 2 3.功能模块设计 2 3.1功能模块设计总述 2 3.2 客户端子系统模块设计 4 3.2.1 模块 CM1 &#xff1a;静态页面 4 3.2.2 模块 CM2&#xff1a;系统登录 5 3.2.3 模块 CM3 &#xff1a;注…

软件概要设计的过程与任务

在完成对软件系统的需求分析之后&#xff0c;接下来需要进行的是软件系统的概要设计。一般说来&#xff0c;对于较大规模的软件项目&#xff0c;软件设计往往被分成两个阶段进行。首先是前期概要设计&#xff0c;用于确定软件系统的基本框架&#xff1b;然后是在概要设计基础上…

软件工程技术--第四章 概要设计

第四章 概要设计 4.1 软件设计概述 4.1.1 软件设计的概念与重要性 ​ 软件设计是软件工程的重要阶段&#xff0c;是一个将软件需求转换为软件表示的过程。软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成预定的任务&#xff0c;即确定系统的物理模型&#xff0…

ios 新建项目关于Main.storyboard的处理

使用xcode新建新建项目时&#xff0c;都会带一个main.storyboard的主界面。如果你不进行代码控制&#xff0c;默认APP启动会加载main.storyboard这个界面。怎么使用这个界面来加载这里就不在介绍了&#xff0c;这里只说用代码加载主页&#xff0c;不使用main.storyboard时&…

storyboard 使用

Storyboard是一项令人兴奋的功能&#xff0c;在iOS5中首次推出&#xff0c;在开发app的界面时可以极大地节省时间。 如下图所示&#xff0c;这就是一个完整的应用的storyboard&#xff0c;接下来我们要学习如何通过这种方式创建应用。 现在你可能还不是很精确地知道我们的应用可…

ios storyboard简单用法

使用xcode5中的storyboard&#xff0c;做个简单的界面&#xff0c;第一次用简直一头雾水&#xff0c;摸索下来感觉也蛮方便的。 从左到右&#xff0c;从上到下&#xff0c;控件依次是&#xff1a;UITextFiled&#xff0c;UIButton&#xff0c; UILabel&#xff0c; UIPickerVi…