android多点触摸手势,安卓手势学习笔记(三) 多点触控

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

跟踪多个触点

当多个手指同时触碰屏幕时,系统产生如下的事件:ACTION_DOWN –第一个触点。它启动了手势,在MotionEvent中该触点的数据索引是0.

ACTION_POINTER_DOWN –第一个触点之后触碰屏幕的其他触点。其索引通过getActionIndex()获取。

ACTION_MOVE –已经按下的手势发生变化。

ACTION_POINTER_UP –非最初手指抬起时发送。

ACTION_UP –最后一个手指离开屏幕时发送。

在MotionEvent中通过索引和ID可以跟踪各个触点。

索引:MotionEvent在一个数组中存储各个触点的信息。触点的索引就是触点在数组中的位置。大多数的MotionEvent方法使用索引来与触点交互。

ID:每个触点在触摸事件中维持一个ID映射,可以在整个手势过程中跟踪单独的触点。

各个触点在触摸事件中出现的顺序是不确定的。所以触点的索引可能在各个事件中不同,但其ID则会保持为一个常数。使用getPointerID()方法可以获取其ID。接下来的事件中,使用findPointerIndex()方法可以获取指定ID的触点的索引。例如:private int mActivePointerId;

public boolean onTouchEvent(MotionEvent event) {

....

// Get the pointer ID

mActivePointerId = event.getPointerId(0);

// ... Many touch events later...

// Use the pointer ID to find the index of the active pointer

// and fetch its position

int pointerIndex = event.findPointerIndex(mActivePointerId);

// Get the pointer's current position

float x = event.getX(pointerIndex);

float y = event.getY(pointerIndex);

}

获取MotionEvent的动作

使用getActionMasked()(或者用兼容版本MotionEventCompat.getActionMasked()更好)获取MotionEvent的动作。getActionMasked()用来处理多触点,而原来的getAction()方法不行。它返回正在执行的修饰过的动作,不包括触点的索引。可以用getActionIndex()来返回触点的索引。

注意:下面的例子使用MotionEventCompat类,可以为更多平台提供兼容性支持。但MotionEventCompat并非MotionEvent类的替代。它提供了一些静态方法,把MotionEvent作为参数传入,可以获取其相关的事件。int action = MotionEventCompat.getActionMasked(event);

// Get the index of the pointer associated with the action.

int index = MotionEventCompat.getActionIndex(event);

int xPos = -1;

int yPos = -1;

Log.d(DEBUG_TAG,"The action is " + actionToString(action));

if (event.getPointerCount() > 1) {

Log.d(DEBUG_TAG,"Multitouch event");

// The coordinates of the current screen contact, relative to

// the responding View or Activity.

xPos = (int)MotionEventCompat.getX(event, index);

yPos = (int)MotionEventCompat.getY(event, index);

} else {

// Single touch event

Log.d(DEBUG_TAG,"Single touch event");

xPos = (int)MotionEventCompat.getX(event, index);

yPos = (int)MotionEventCompat.getY(event, index);

}

...

// Given an action int, returns a string description

public static String actionToString(int action) {

switch (action) {

case MotionEvent.ACTION_DOWN: return "Down";

case MotionEvent.ACTION_MOVE: return "Move";

case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down";

case MotionEvent.ACTION_UP: return "Up";

case MotionEvent.ACTION_POINTER_UP: return "Pointer Up";

case MotionEvent.ACTION_OUTSIDE: return "Outside";

case MotionEvent.ACTION_CANCEL: return "Cancel";

}

return "";

}

总结

看到这里发现有点混乱,所以和前面单触点的小节整合到一起看一看。首先,每一次触屏事件导致onTouchEvent()被调用,带来一个MotionEvent;

调用MotionEventCompat.getActionMasked(event)方法可以获取这个event的动作;

MotionEvent在一个数组从存储各个触点的数据,他们的索引并不固定;

每个触点同时有一个不变的ID;

调用event.getPointerID(index)可以获取指定索引的ID;

调用event.findPointerIndex(id)可以获取指定ID的索引;

调用MotionEventCompat.getActionIndex()可以获取动作触点的index; // 这里看上去很奇怪,一个event中存在多个触点,为什么要获取index?答案应该是,每个action只针对其中一个触点,所以这样就可以获取当前事件的动作的唯一触点,而其他触点的数据也存在这个event之中;

调用event.getPointerCount()可以区分当前是单触点操作还是多触点操作。

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

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

相关文章

SpringBoot 自动配置实现流程

(1)SpringBoot启动的时候加载主配置类,开启了自动配置功能EnableAutoConfiguration。查看SpringBootApplication (2)查看EnableAutoConfiguration,其作用是利用AutoConfigurationImportSelector给容器中导入…

spring.factories 的妙用

现象 在阅读 Spring-Boot 相关源码时,常常见到 spring.factories 文件,里面写了自动配置(AutoConfiguration)相关的类名,因此产生了一个疑问:“明明自动配置的类已经打上了 Configuration 的注解&#xff0…

学习android 画板源代码,Android实现画画板案例

郑州app开发画画板案例。布局代码是三个button和一个imagesview下面是图片。布局代码就不展示了。下面是java代码。package cn.xhhkj.image;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.graphics.Bitmap;import android.gr…

Spring Boot 之spring.factories

首先抛出一个问题:如果想要被Spring容器管理的Bean的路径不再Spring Boot 的包扫描路径下,怎么办呢?也就是如何去加载第三方的Bean 呢? 有两种方式可以解决: 这里我们使用Swagger的配置来做实验。 1:首先一…

dataearth可视域分析_谁不知道前期分析要用ARCGIS?我就是不会用啊

Q你有没有遇到这样的情况?身边的同事或同学经常说什么高程图、坡向图、坡度图、生态水文图、热力密度图、大数据算法,而自己却一无所知,心里感到特别的慌啊。文末附ArcGIS最新版及超强数据神器 很多人会说,“设计师是感性的&#…

@ImportResource()注解的使用

ImportResource注解用于导入Spring的配置文件,让配置文件里面的内容生效;(就是以前写的springmvc.xml、applicationContext.xml) Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别; 想让Sp…

mybatis3 没有生成example_网站图片尺寸自动生成

目录1. 背景2. 实现思路2.1. 尺寸动态变化2.2. 实时裁剪并静态化3. web或代理服务器插件实现方案1. 背景某天我的前同事给我打电话,说他们的负载很高,经查发现网站首页有20M,原因是首页直接引用高清图片,没有安装分辨率生成缩图。…

无法删除所有指定的值_AutoCAD所有系统变量大全

ACADLSPASDOC 0 仅将 acad.lsp 加载到 AutoCAD 任务打开的第一个图形中; 1 将 acad.lsp 加载到每一个打开的图形中ACADPREFIX 存储由 ACAD 环境变量指定的目录路径(如果有的话),如果需要则附加路径分隔符ACADVER 存储 AutoCAD 的版本号。这个变量与 DXF 文件标题变量…

简述HTML语言概念,HTML语言的基本概念和基本格式.doc

HTML语言的基本概念和基本格式HTML语言的基本概念和基本格式当使用Netscape Navigator 与 Interne Explorer 这些浏览器在Interent上尽情遨游的时候,肯定会被丰富多彩的屏幕内容所吸引,而这些丰富多彩的内容背后,只是用一种简单的超文本标志语…

为什么线程池里的方法会执行两次_新手一看就懂的线程池

作者:码农田小齐来源:https://www.cnblogs.com/nycsde/p/14003888.html那相信大家也能感受到,其实用多线程是很麻烦的,包括线程的创建、销毁和调度等等,而且我们平时工作时好像也并没有这样来 new 一个线程,其实是因为很多框架的底…

华为鸿蒙热水器,美的华为跨界联合!搭载鸿蒙OS的美的产品双11上市

【宅秘新闻】在前段时间的华为开发者大会上,华为正式发布了鸿蒙OS 2.0。华为消费者业务软件部总裁王成录当时表示,美的等家电品牌很快就会推出基于鸿蒙OS 2.0的家电产品。11月11日,美的集团官方宣布搭载鸿蒙OS的美的产品在双十一惊喜上市。宅…

Eclipse构建Maven分包分模块项目并构建服务端

首先说一下Maven 模块结构: 一个简单的Maven模块结构是这样的: ---- app-parent 一个父项目(app-parent)聚合很多子项目(app-util,app-dao,app-service,app-web) |---- pom.xml (pom) | |-------- app-util | |-------- pom.xml (jar) | |-------- app-…

我们一起动手学大模型应用开发

大模型正逐步成为信息世界的新革命力量,其通过强大的自然语言理解、自然语言生成能力,为开发者提供了新的、更强大的应用开发选择。 随着国内外井喷式的大模型 API 服务开放,如何基于大模型 API 快速、便捷地开发具备更强能力、集成大模型的…

登陆页面html5代码qq,HTML5QQ登录的一篇代码分享

html5背景*{margin:0;padding:0;list-style-type:none;}a,img{border:0;}$(function () {if (!window.ActiveXObject && !!document.createElement("canvas").getContext) {$.getScript("http://im-img.qq.com/pcqq/js/200/cav.js?_1428576021379"…

unity 多台 显示器 控制_飞利浦292E2E评测丨宽屏显示器中的多面手

■本文来自中关村在线屏幕比例21:9或32:9的显示器,因为横向屏幕很长,所以被人形象的称为带鱼屏。相较于16:9的显示器,屏幕拥有更多显示面积,我们能获得更多信息,大大提升办公效率。同时带鱼屏打游戏和看电影时也能获得…

Idea 创建简单的SpringBoot 父子项目

背景 使用Idea 创建一个模块化的SpringBoot项目,但是发现Idea 创建父子项目的方式较Eclipse 较为不同,且Idea 创建的过程较Eclipse创建父子项目的过程复杂。 Eclipse 创建SpringBoot父子项目传送门 网上虽然有Idea创建SpringBoot父子项目,但…

微服务架构与SpringCloud

微服务架构简述 通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合为用户提供最终价值。服务之间采用轻量级的通…

REST和RPC是什么东东?两者有什么区别

1 REST与RPC概念 什么是REST REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。REST规范把所有内容都视为资源,网络上一切皆资源。 REST并没有创造新的技术,组件或服务&#xff0c…

简述计算机进行远程桌面管理操作过程,服务器应用之“远程桌面连接”(操作篇)...

在上篇《服务器应用之“远程桌面连接”(部署篇) 》《服务器应用之“远程桌面连接”(建立篇) 》,我们介绍了远程桌面的部署和建立方法。在远程桌面连接成功后就可以进行一些远程桌面连接可以进行的计算机管理了。具体可以进行的远程桌面连接操作如下:1. 使…

未为dll加载任何符号_专家发现aspersky 和Trend Micro安全性解决方案中的DLL劫持问题...

SafeBreach的研究人员发现了Kaspersky安全连接、Trend Micro最大安全性和Autodesk桌面应用程序中的几个DLL劫持漏洞,黑客可以利用这些漏洞进行DLL预加载、代码执行和权限升级。第一个问题在卡巴斯基安全连接(KSDE) VPN客户端,跟踪为CVE-2019-15689&#…