关于android多点触控

最近项目需要一个多点触控缩放的功能。然后上网查了下资料 总结一下:

首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion="4"  并且建工程的时候选的是android 2.2就表示你的应用兼容android1.6~android2.2

之间的版本。但是多点触控的API在1.6~~2,1~~,2,2~~三个版本中都是不一样的。比如android2.2中onTouchEvent(MotionEvent event) 这里可以用event.getActionMasked()

表示用于多点触控检测点。但在1.6和2.1中并没有event.getActionMasked()这个方法,查源码后发现其实他就是吧event.getAction()& MotionEvent.ACTION_MASK封装了一下。

对于这些小细节我们要特别注意,因为这关乎版本兼容问题,也许你在2.2的设备上运行没什么问题,但1.6或者2.1就会出个什么问题之类的。所以对于1.6以后新增加的功能,要特别注意API

的使用。1.5就暂不考虑了。

接下来看代码:

 1 package laahaa.framework; 2  3  4  5 import android.content.Context; 6 import android.graphics.PointF; 7 import android.util.AttributeSet; 8 import android.util.FloatMath; 9 import android.view.MotionEvent;10 import android.view.SurfaceHolder;11 12 /**13  * 14  * 游戏画布15  */16 public class GameView2X extends GameView implements SurfaceHolder.Callback {17 18     private float oldDist;19     private PointF midPoint = new PointF();20     private boolean isZoom = false;21 22     public GameView2X(Context context, AttributeSet attrs) {23         super(context, attrs);24 25     }26 27     public boolean onTouchEvent(MotionEvent event) {28 29         switch (event.getAction() & MotionEvent.ACTION_MASK) {30         case MotionEvent.ACTION_DOWN:31             super.actionDown(event);32             break;33         case MotionEvent.ACTION_POINTER_UP:34             isZoom = false;35             break;36         /**37          * API原文是 A non-primary pointer has gone down.38          * 翻译过来就是:非第一个点按下39 */40         case MotionEvent.ACTION_POINTER_DOWN:41             oldDist = spacing(event);42             midPoint(midPoint, event);43             isZoom = true;44             break;45         case MotionEvent.ACTION_MOVE:46             if (isZoom) {47                 float newDist = spacing(event);48                 /**49                  * 表示新的距离比两个手指刚触碰的距离大50                  * ( +10个像素用来延迟一下放大,不然稍微动一点像素,也放大,感觉也太快了。)51 */            52                 if (newDist + 10 > oldDist) {53                     super.getGameThread().getGameDraw()54                             .checkXY((int) midPoint.x, (int) midPoint.y);55                     super.getGameThread().getGameDraw().setIsZoom(true);56                 }57                 /**58                  * 表示新的距离比两个手指刚触碰的距离小59 */    60                 if (newDist + 10 < oldDist) {61                     super.getGameThread().getGameDraw().setIsZoom(false);62                     GameDraw.newX = 0;63                     GameDraw.newY = 0;64                 }65             }66             super.actionMove(event);67 68             break;69         }70 71         return true;72     }73 74     private float spacing(MotionEvent event) {75         float x = event.getX(0) - event.getX(1);76         float y = event.getY(0) - event.getY(1);77         return FloatMath.sqrt(x * x + y * y);78     }79 80     private void midPoint(PointF point, MotionEvent event) {81         float x = event.getX(0) + event.getX(1);82         float y = event.getY(0) + event.getY(1);83         point.set(x / 2, y / 2);84     }85 }

这里要注意下GameView2X表示2.0以上的版本 他继承于我自己写的低版本的GameView。因为有很多重复代码继承是必须的。最后要注意下:获取当前应用的SDK版本代码为:

int sdkVersion=Integer.parseInt(Build.VERSION.SDK);

你需要在最开始初始化的时候运行它,写入GameConfig中比较好,后面单例调用就好了。或者不喜欢单例的直接static final 也行。然后再选择gameview的时候 加个if判断,

if(sdkVersion<Build.VERSION_CODES.ECLAIR)

{}

else

{}

好了,这里的多点触控放大比较简单,其实可以根据前距离/后距离的比值来动态设置缩放。这只是个简单的例子。

ps:最近发现 onTouchEvent事件中的参数MotionEvent,它有一个getSize()方法。在一个点的时候,该方法永远返回0,而在两个触电的时候,该方法则根据两点相对位置变化而返回不同的值

时间: 2024-12-09 21:22:26

关于android多点触控的相关文章

Android多点触控技术

1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放.手势操作上有更好的用户体验. 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN,而移动操作时为 ACTION_MOVE,最终放开手指时触发ACTION_UP事件.当然还有用户无规则的操作可能触发ACTION_CAN

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

本文主要介绍Android的多点触控,使用了一个图片缩放的实例,来更好的说明其原理.需要实现OnTouchListener接口,重写其中的onTouch方法. 实现效果图: 源代码: 布局文件: activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&quo

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

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的.因此本篇文章中,我们就来对这一功能进行完善,加入点击图片就能浏览大图的功能,并且在浏览大图的时候还可以通过多点触控的方式对图片进行缩放. 如果你还没有看过 Android瀑布流照片墙实现,体验不规则排列的美感

android 多点触控

多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEvent的一些常用的方法: getPointerCount() 获得触屏的点数. getPointerId(int pointerIndex) 返回一个触摸点的标示,pointIndex是你第几个触控点的索引 getX() 获得触屏的X坐标值 getY() 获得触屏的Y坐标值 getAction()

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

最近做View的多点触控时,每次第一次触控事件完美运行,第二次就直接崩了,错误信息如下: 01-03 00:05:44.220 4377-4410/system_process E/AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.ui java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nat

Android多点触控MultiTouch浅析

申明: 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0226/914.html 下面实现如何通过应用层支持多点触控操作,对于常规的控件触控操实现onTouchEvent()方法来处理.同时对onTouchEvent方法的参数MotionEvent进行一些了解. 正文: 下面会用两个应用示例来初步学习一下Android中的多点触控. 示例一(DemoMultiTouch-Canvas): 核心技术介绍 本示例是在Sur

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

首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能,这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements

Android多点触控缩放拖拽实例

在Android上查看图片或者浏览网页时,我们往往有把图片或者网页放大或者缩小的的需求,这样就能够获得更多的细节信息 或者获得更多的全貌信息,多点触摸与绽放功能正是满足这种应用场景的技术. 下面通过一个例子来学习实现图片的拖拉功能: 程序运行示意图:1.初始化界面  2.为缩小的界面  3.为放大的界面            新建一个名称为DragAndDrop的Android工程,目录结构如下: 主界面的activity_layout.xml的布局代码如下: <RelativeLayout x

Android多点触控

public class MainActivity extends Activity implements OnTouchListener { // 放大缩小 Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); PointF start = new PointF(); PointF mid = new PointF(); float oldDist; private ImageView myImageView; //