Android中多点触控以及手势的基础知识

现在一般的android手机都会使用电容触摸屏,所以基本上都会支持多点触控,同样在android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求,下面简单讲一下如何使用多点触控:

1、相关接口和事件介绍

MotionEvent.getAction() 

对于单点触控,我们由MotionEvent.getAction()就可以得到以下几种事件:ACTION_DOWN、ACTION_UP等

MotionEvent.ACTION_MASK

而对于多点触控,我们需要由MotionEvent.getAction() &MotionEvent.ACTION_MASK一起得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP等

单点和多点两者共用的:ACTION_MOVE等,所以需要区分当前是单点还是多点才能正确的处理。

这些得到的值都是MotionEvent中的常量,可以直接调用。

另外还有很多辅助接口:

event.getPointerCount() 获取当前触控点的数量

event.getPointerId(i) 获取指定触控点的Id,用于区分不同的触控点

event.getX(i) 获取指定触控点的X坐标

event.getY(i) 获取指定触控点的Y坐标

event.getPressure(i) 获取指定触控点的压力值,此值的获取需要LCD硬件和驱动的支持

2、常用手势的处理——双指伸缩

双指伸缩手势常用于图片、文本、网页等的放大和缩小,在实际中的使用非常频繁,下面就简单讲一下具体的原理:

如果当前没有别的手势干扰,我们只需检测两指按下时各自的位置、两点的距离以及两指移动之后的各自位置、亮点的距离关系即可,如果移动后距离变大,则是放大动作;反之则是缩小动作。

首先要计算两指按下时的距离:

 得到移动之前两指按下的点之间的距离,具体原理相信学过勾股定理的同学同应该知道,由点1的x减去点2的x可以得到一条直角边的长度,正负不重要,因为在下面的计算时会计算平方而得到正值长度,然后由点1的y减去点2的y可以得到另外一条直角边的长度,这样由两条直角边可以用勾股定理得出斜边的长度,即两点之间的直线距离。

   private float spacing(MotionEvent event)
   {
       float x = event.getX(0)-event.getY(1);
       float y = event.getY(0)-event.getY(1);
       return (float)Math.sqrt(x*x+y*y);
   }

在此同时还需要计算出两指的中点位置,以作为缩放的中心基准点,这个计算方法就更简单了,由点1的x加上点2的x然后除以2,得到中点的x坐标,由点1的y加上点2的y然后除以2,得到中点的y坐标,最后得到中点的坐标位置:

    private void midPoint(PointF point, MotionEvent event)
    {
         float x = event.getX(0) + event.getX(1);
         float y = event.getY(0) + event.getY(1);
         point.set(x / 2, y / 2);
    }

然后在ACTION_MOVE的事件处理中得到移动后的亮点之间的直线距离,计算方法同上,如果移动后的距离大于按下时的距离则是放大动作,否则是缩小动作,具体放大和缩小的比例由:新距离/移动前的距离,得到比例系数,然后就可以使用相关接口和操作进行具体的放大或缩小处理,常用的缩放方式:

使用Martix的postscale(横向缩放比例,纵向缩放比例,中点的x,中点的y),一般需要先获取图片或者控件等的martix,然后调用postscale将参数传递进去,得到新的缩放后的martix,最后再设置回去,刷新之后即可生效,看到缩放后的效果。

时间: 2024-09-13 04:22:10

Android中多点触控以及手势的基础知识的相关文章

WP8中多点触控,浏览图片的时候,如何控制图片在拖动过程中不被拖出屏幕?

问题描述 WP8中多点触控,浏览图片的时候,如何控制图片在拖动过程中不被拖出屏幕? 如果!我现在在多点触控的时候,放大缩小实现了,但放大后拖动图片,会将图片拖出屏幕,这是我做的一个DEMO, 地址如下:https://onedrive.live.com/redir?resid=56C8C9A332A136A7!287&authkey=!AL5pu2Nvxx66dGc&ithint=file%2c.rar可以下载此demo下来看下,在此demo基础下修改,或者有现成的控制例子也可以,实在是想

多点触摸-IE中多点触控如何禁止

问题描述 IE中多点触控如何禁止 现在有一台PC,硬件支持多点触控.安装win7 操作系统.现在安装了一个应用程序,控制层用vc++开发,页面部分用的是html和vb开发.应用程序启动时,浏览器会启动显示.现在希望在IE浏览器中禁止多点触控操作.其他应用程序中都依旧支持触控操作.具体需要做哪些处理呢?各路大神请不吝赐教~ 解决方案 这个最后暂定处理方式:win7 ie支持的四种触摸动作为:ontouchstart ontouchmove ontouchend ontouchcancel 用js实

Android实现多点触控,自由缩放图片的实例代码

Android多点触控涉及到的知识点 1.ScaleGestureDetector 2.OnScaleGestureListener 3.Matrix 4.OnTouchListener 四个知识点需要了解一下,需要注意的是Matrix在内存中是一个一维数组,操控图片的Matrxi是一个3X3的矩阵,在内存中也就是一个大小为9的一维数组. 实现多点触控,自由变化图片 1. ImageView的基础上继承 2.因为要在图片加载完成就获取到相关的属性,所以实现OnGlobalLayoutListen

Android开发实例之多点触控程序_Android

       智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲解多点触控程序的实现.        首先来了解一下Android中多点触控的原理.        Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multito

Android开发实例之多点触控程序

智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲解多点触控程序的实现. 首先来了解一下Android中多点触控的原理. Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放.手势操作上有更好

listview-Android 手势多点触控的一些问题

问题描述 Android 手势多点触控的一些问题 如下图:是一个ListView嵌套GridView的效果,现在想实现类似系统图库的缩放功能.就是在这个页面可以进行手势缩放.默认现在是一行有四张图片,缩小的时候,一行就有6张图片,放大的时候就是回到初始的4张图片.如果了解系统图库的话,就很明白了!实在想不到有什么办法,前辈指点一下吧!谢谢了! 解决方案 同关注,顶一下,谢谢. 解决方案二: android 处理多点触控手势

Android多点触控手势基础

处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上. 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的手指. 触控事件:在触控手势中,有手指移动或者离开屏幕的时候就会引发一个触控事件.这个事件就存放在MotionEvent中. 在这个事件中,包含说与的触控数据. 触控:手指碰到屏幕的时候就产生了一个触控(pointer). 追踪多个触控点 多个手指同时放在屏幕上的时候会触发以下的系统事件: ACTI

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

文章将在原有基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View.OnTouchListener , V

Android多点触控实现图片自由缩放_Android

Android多点触控涉及到的知识点 1.ScaleGestureDetector 2.OnScaleGestureListener 3.Matrix 4.OnTouchListener 四个知识点需要了解一下,需要注意的是Matrix在内存中是一个一维数组,操控图片的Matrxi是一个3X3的矩阵,在内存中也就是一个大小为9的一维数组. 实现多点触控,自由变化图片 1. ImageView的基础上继承 2.因为要在图片加载完成就获取到相关的属性,所以实现OnGlobalLayoutListen