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

首先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. pl/sql 的 put和put_line区别

    在学习PL/SQL脚本时,打印语句是用得最多的语句. 在Oracle中,又有两种打印的方法:put和put_line.它们的区别是:put:不换行输出,输出在缓冲区,不显示出来,直到执行put_lin ...

  2. java面板设计

    写面板真的是写到吐血,深深感受到什么叫又臭又长,可能是自己用的太烂吧. 关于布局管理器不写一下还是不懂,另外加面板的思想跟html中div的感觉差不多. 发现的一个小彩蛋:用JScrollPane的时 ...

  3. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  4. 二分图最大匹配 hdoj 1045

    题目:hdoj1045 题意:给出一个图.当中有 . 和 X 两种,. 为通路,X表示墙,在当中放炸弹,然后炸弹不能穿过墙.问你最多在图中能够放多少个炸弹? 分析:这道题目是在上海邀请赛的题目的数据简 ...

  5. .NET C#操作文件系统数据的常用方法总结 part1

    目录导航 1.0开启文件隐藏属性 1.1开启文件夹只读属性 1.2输出子文件夹路径 1.3统计文件数目 1.4批量重命名文件 1.5分割文件 1.6拼接文件 1.7读取用逗号分割的值 1.8读写压缩数 ...

  6. pycharm+QT4的helloworld

    # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 exc ...

  7. WPF-22:WPF绘制五角星改进版(增加半个五角星的绘制)-修改bug

    之前用坐标画多边形的方法,绘制五角星.今天调试时发现当时写的时候有bug,修改一下. 原文: http://blog.csdn.net/yysyangyangyangshan/article/deta ...

  8. C++sort函数使用总结

    头文件:algorithm 对于(整数/字符)数组进行比較时,可直接通过sort(a,a+n)或sort(a.begin(),a.end())进行排序,默认升序排列,须要高速实现降序时,有三种方案 1 ...

  9. Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...

  10. 字符串处理-AC自动机

    估计在OJ上刷过题的都会对AC自动机这个名词很感兴趣,同样,记得去年ACM暑期集训的时候,在最后讲到字符串部分,听说了这个算法的名字之后就对于它心向往之,AC正好是Accept的简称,字面意义上的理解 ...