处理多点触控手势

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

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

  • 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的手指。
  • 触控事件:在触控手势中,有手指移动或者离开屏幕的时候就会引发一个触控事件。这个事件就存放在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. golang 创建一个简单的连接池,减少频繁的创建与关闭

    一.连接池的描述图片如下: 二.连接池代码如下: package main; import ( "time" "sync" "errors" ...

  2. go语言中的接口interface

    package main; import "fmt" //接口interface //接口是一个或多个方法签名的集合 //只要某个类型拥有该接口的所有方法签名,即算实现该接口. / ...

  3. Linux移植之配置过程分析

    在Linux移植之移植步骤中已经将Linux移植的过程罗列出来了,现在分析一下Linux的配置过程,将分析以下两个配置过程: 1.make s3c2410_defconfig分析 2.make men ...

  4. Oracle_SQL(2) 分组与聚合函数

    一.聚合函数1.定义:对表或视图的查询时,针对多行记录只返回一个值的函数.2.用途:用于select语句,HAVING条件二.5种聚合函数1.SUM(n) 对列求和 select sum(sal) f ...

  5. python下的MySQL数据库编程

    https://www.tutorialspoint.com/python/python_database_access.htm if you need to access an Oracle dat ...

  6. 可读性很强的C语言的函数指针定义

    通常C/C++程序里面要用到大量的指针,其语法非常难以阅读.比如下面的vp指针类型: #include <iostream> using namespace std; typedef vo ...

  7. a label can only be part of statement and a declaratioin is not a statement

    参考资料: https://stackoverflow.com/questions/18496282/why-do-i-get-a-label-can-only-be-part-of-a-statem ...

  8. list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作

    list,set等集合遍历时,不能remove集合中的元素.需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAl ...

  9. QualNet/EXata的发展贯穿在美军网络中心战演进的始终

    QualNet/EXata的发展贯穿在美军网络中心战演进的始终 赵玉亭 1.   QualNet/EXata的前身GloMoSim是美国防部高级计划研究局(DARPA)在1994年启动的全球移动信息系 ...

  10. spring boot所有配置

    转载 http://blog.csdn.net/lpfsuperman/article/details/78287265 # 日志配置# 日志配置文件的位置. 例如对于Logback的`classpa ...