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

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

现在一般的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,最后再设置回去,刷新之后即可生效,看到缩放后的效果。



目录
相关文章
|
3月前
|
Android开发
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
Android基础知识:请解释Service是什么,它与IntentService的区别是什么?
39 0
|
3月前
|
Android开发 开发者
Android基础知识:什么是Intent?有哪些类型的Intent?
Android基础知识:什么是Intent?有哪些类型的Intent?
55 0
|
3月前
|
数据库 Android开发 开发者
Android基础知识:请解释Activity的生命周期。
Android基础知识:请解释Activity的生命周期。
43 2
|
3月前
|
Java Linux Android开发
Android基础知识:解释什么是Android(安卓)操作系统?
Android基础知识:解释什么是Android(安卓)操作系统?
149 0
|
3月前
|
Java Shell Linux
Android——编译(一):编译make的基础知识
Android——编译(一):编译make的基础知识
68 0
|
3月前
|
Android开发
Android基础知识:什么是Fragment?与Activity的区别是什么?
Android基础知识:什么是Fragment?与Activity的区别是什么?
285 54
|
3月前
|
数据库 Android开发 开发者
Android基础知识:什么是Android应用的四大组件?
Android基础知识:什么是Android应用的四大组件?
62 1
|
4月前
|
Java 开发工具 Android开发
[Android]JNI的基础知识
[Android]JNI的基础知识
46 0
[Android]JNI的基础知识
|
4月前
|
XML Java Android开发
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
36 0
|
8月前
|
安全 Java 编译器
Android逆向 | 基础知识篇 - 03 - 关于 Android 体系结构的学习
Android逆向 | 基础知识篇 - 03 - 关于 Android 体系结构的学习