处理多点触控手势

多点触控就是同时把一根以上的手指放在屏幕上。

再继续往下以前需要补充一些名词:

  • 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的手指。
  • 触控事件:在触控手势中,有手指移动或者离开屏幕的时候就会引发一个触控事件。这个事件就存放在MotionEvent中。

    在这个事件中,包含说与的触控数据。
  • 触控:手指碰到屏幕的时候就产生了一个触控(pointer)。

追踪多个触控点

多个手指同时放在屏幕上的时候会触发以下的系统事件:

  • ACTION_DOWN --第一个对屏幕的触碰。这是多点触控的开始。这个触碰的而数据

    保存在index为0的MotionEvent中。
  • ACTION_POINTER_DOWN--其他对屏幕的触碰。触碰事件的index可以用方法getActionIndex()获取到。

    触碰的数据保存在这个index指定的MotionEvent中。
  • ACTION_MOVE--放在屏幕上的任何一根手指移动的时候触发。
  • ACTION_POINTER_UP--第一个触摸屏幕的手指以外的其他手指离开屏幕的时候触发。
  • ACTION_UP--当最后一根手指离开屏幕的时候触发。

你可以通过触碰事件的index或者ID来获得事件MotionEvent

  • Index: 一个MotionEvent存储了几根手指触摸屏幕的每一个手指的触碰数据。一般处理触摸

    的是后都用index作为获取MotionEvent的依据,而不是触碰ID。
  • ID:整个多点触摸事件过程中,每一个触摸都有一个ID和整个触摸匹配。

一个触碰的index在MotionEvent中可能发生改变的。而整个触碰的ID是保持不变的,只要整个

触碰保持激活状态。用getPointerId()可以获取整个手势执行期间的每一个event里的触碰数据。

也可以通过findPointerIndex()来根据一个触控的ID来获取这触控在触控事件中的index。比如:

var mActivePointerId: Int? = null

override fun onTouchEvent(event: MotionEvent?): Boolean {
mActivePointerId = event?.getPointerId(0) // 其他的事件先不管... // 用触控ID获得index,然后获取位置数据
var pointerIndex = event?.findPointerIndex(mActivePointerId!!) // 获取触控的当前位置
var x = event?.getX(pointerIndex!!)
var y = event?.getY(pointerIndex!!) return true
}

获取一个MotionEvent的Action

你应该使用getActionMasked()(或者从兼容方面考虑的话用MotionEventCompat.getAtionMasked()来获取

MotionEvent的action。与getAction()不同,getActionMasked()就是被用来处理多点触控的。

这个方法的返回值不在包含触控index的位数。你可以用getActonIndex()来获取触控action的index。这些在后面详细叙述。

注意:后面的例子用的是MotionEventCompat类。这个类在Support Library中。
你可以使用MotionEventCompat来获得更多的平台支持。MotionEventCompat不是用来代替MotionEvent的。
其实,这个类只是提供了一些静态方法以方便使用。
override fun onTouchEvent(event: MotionEvent?): Boolean {
var action = MotionEventCompat.getActionMasked(event!!) var index: Int = MotionEventCompat.getActionIndex(event!!)
var xPos = -1.0f
var yPos = -1.0f Log.d(TAG, "The action is " + actionToSring(action)) if (event!!.pointerCount > 1) {
Log.d(TAG, "Mutipletouch event") // 坐标系是相对于处理这个事件的View或者Activity的
xPos = MotionEventCompat.getX(event!!, index)
yPos = MotionEventCompat.getY(event!!, index)
} else {
//单点触控
Log.d(TAG, "Single touch event")
xPos = MotionEventCompat.getX(event!!, index)
yPos = MotionEventCompat.getY(event!!, index)
} return true
} fun actionToSring(action: Int): String {
when (action) {
MotionEvent.ACTION_DOWN -> return "Down"
MotionEvent.ACTION_MOVE -> return "Move"
MotionEvent.ACTION_POINTER_DOWN -> return "Pointer down"
MotionEvent.ACTION_UP -> return "UP"
MotionEvent.ACTION_POINTER_UP -> return "Pointer up"
MotionEvent.ACTION_OUTSIDE -> return "Outside"
MotionEvent.ACTION_CANCEL -> return "Cancel"
}
return ""
}

原文是Google的文档。但是文档杜宇前提和一些概念的描述不足,会导致初学者理解出现偏差。我都加上了,我就是初学者。

代码都是用Kotlin写的,自从用了这个语言就再也不想用Java了。对于Java开发者理解Kotlin的代码没有什么太大的问题,基本上都一样。

Android多点触控手势基础的更多相关文章

  1. Android多点触控技术

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  2. [yueqian_scut]Android多点触控技术和应用框架

    Android多点触控技术跟Linux输入子系统紧密相关.本文将从应用的角度说明Android多点触控技术的接口和应用. 一.多点触控场景分析 网络上有关Android多点触控技术的文章多见于两点拉伸 ...

  3. Android 多点触控与简单手势(一)

    现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求. And ...

  4. Android多点触控技术实战,自由地对图片进行缩放和移动

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果, ...

  5. Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

    首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能.这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2 ...

  6. Android 多点触控错误处理(java.lang.IllegalArgumentException: pointerIndex out of range)

    最近做View的多点触控时,每次第一次触控事件完美运行,第二次就直接崩了,错误信息如下: 01-03 00:05:44.220 4377-4410/system_process E/AndroidRu ...

  7. 关于android多点触控

    最近项目需要一个多点触控缩放的功能.然后上网查了下资料 总结一下: 首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion ...

  8. Android多点触控(图片的缩放Demo)

    本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.须要实现OnTouchListener接口,重写当中的onTouch方法. 实现效果图:       源码: 布局文 ...

  9. 在 Mac 上使用多点触控手势

    使用多点触控触控板或妙控鼠标,可以通过轻点.轻扫.捏合或开合一根或多根手指进行有用的操作. 触控板手势 有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“触控板”.您 ...

随机推荐

  1. StackExchange.Redis使用以及封装

    来源:http://www.cnblogs.com/qtqq/p/5951201.html Redis安装:http://www.runoob.com/redis/redis-install.html ...

  2. linux C程序中获取shell脚本输出(如获取system命令输出)

    转载自 http://blog.csdn.net/hjxhjh/article/details/7909518 1. 前言 Unix 界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些 ...

  3. iconfont项目成员添加不进去的问题

    经别的网友提醒,发现是我用的chrome浏览器的问题,这顿折腾....解决方案:换一个浏览器试试.

  4. vue通过代理实现跨域

    http://www.cnblogs.com/wangyongcun/p/7665687.html

  5. Varnish 入门

    本文将介绍 varnish 的工作流程,安装以及 varnish 的配置三个方面的内容.首先简单的介绍 varnish 以及其工作流程,大概了解其内部原理,然后介绍了 varnish 的安装方法,最后 ...

  6. oracle sqlplus操作

    步骤: su - oracle 切换到oracle用户 sqlplus /nolog 进入sqlplus命令行 conn cps/cps 连接到cps用户的数据库,cps/cps表示:用户/密码 执行 ...

  7. Eclipse中配置Tomcat服务器并创建标准Web目录

    Eclipse创建 Java Web 项目,并生成标准的目录结构 file --> New --> Dynamic Web project 填写 Project name (该名称项目的名 ...

  8. Maximum Subarray LT53

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  9. 如何在Android平台上使用USB Audio设备

    http://blog.csdn.net/kevinx_xu/article/details/12951131 需求:USB Headset插上去后,声音要从本地CODEC切换到USB Headset ...

  10. day13作业—(登录注册)

    2.写一个函数完成三次登陆功能: 用户的用户名密码从一个文件register中取出. register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行. 完成三次验证, ...