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

首先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,而在两个触电的时候,该方法则根据两点相对位置变化而返回不同的值

关于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 多点触控错误处理(java.lang.IllegalArgumentException: pointerIndex out of range)

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

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

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

  7. android 多点触控

    多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEv ...

  8. Android多点触控手势基础

    处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上. 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的 ...

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

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

随机推荐

  1. android 破解九宫格

    将目录切换到D:/adb目录下,命令如下 敲入命令 adb shell 然后回车,可以见到如下结果 再敲入命令cd /data/system然后回车, 再执行 rm gesture.key 回车,搞定 ...

  2. java学习之IO装饰设计模式

    装饰设计模式就是对已有的对象的功能进行增强 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装 ...

  3. Object 保存到文件中

    6月4日 Object 保存到文件中  Q. 你添加一个新类到你的项目当中且你希望可以保存这个类的一个实例对象到磁盘文件 并在需要时从磁盘文件读回到内存中  A. 方案  确保你的类遵循 NSCodi ...

  4. HDU 5045 Contest(状压DP)

    Problem Description In the ACM International Collegiate Programming Contest, each team consist of th ...

  5. C++中,引用作为函数参数

    引用作为函数参数 C++之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能. ———————————————————— c++,函数传参:(1)将变量名作为实参和形参.这时传给形参 ...

  6. js回调函数2

    使用sublime结合node.js来写js代码特别爽,具体网上有教程.详见:http://blog.csdn.net/dududu01/article/details/42804367 ,其中最主要 ...

  7. Python 2.7 学习笔记 模块和包

    我们来考虑下如下几种场景: 1.编写一个python程序,如果程序比较简单,则可以把代码放到一个python文件中.但如果程序功能比较多,可能需要多个python文件来组织源代码.而这些文件之间的代码 ...

  8. Json也可以这么使

    public string GetJSON() { //Json数据 string json112 = "{\"control_info\":{\"imei\& ...

  9. python模块介绍- multi-mechanize 性能测试工具

    python模块介绍- multi-mechanize 性能测试工具 2013-09-13 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 3739 ...

  10. Android跟蓝牙耳机建立连接有两种方式

    Android 跟蓝牙耳机建立连接有两种方式. 1. Android 主动跟蓝牙耳机连BluetoothSettings 中和蓝牙耳机配对上之后, BluetoothHeadsetService 会收 ...