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

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

转载于:https://www.cnblogs.com/Free-Thinker/p/4712679.html

关于android多点触控相关推荐

  1. Android多点触控详解

    本文转载自GcsSloop的 安卓自定义View进阶-多点触控详解 的文章 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带 ...

  2. 模拟Android多点触控

    Android多点触控 Android多点触控 多点触控实现思路 第一种adb shell input方式 第二种adb shell sendevent方式 多点触控实现思路   经过资料的查询,要在 ...

  3. Android多点触控揭秘

    本文原创,转载请注明:http://blog.csdn.net/cloudzfy1/article/details/6582707 Google 暑期大学生博客分享大赛 - 2011 Android ...

  4. Android多点触控技术

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  5. Android 多点触控消息捕获与处理

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  6. Android 多点触控 MotionEvent详解

    相关API 介绍 MotionEvent.getY() 和 MotionEvent.getRawY() 的区别 getY 表示触摸事件在当前的View内的Y 坐标, getRawY表示触摸事件在整个屏 ...

  7. Android多点触控MultiTouch浅析

    申明: 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0226/914.html 下面实现如何通过应用层支持多点触控操作, ...

  8. android 多点触控缩放,Android多点触控(图片的缩放Demo)

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

  9. android多点触控

    网上搜索后有很多的多点触控的东西,自己也写个吧,实现的就是在屏幕上画个圆角的矩形随着2点的大小而变换. 下面的东西是在网上找的一个例子然后自己更改的. View Code 1 package com. ...

最新文章

  1. 《C++primer》第二章--变量和基本内置类型
  2. 出块过程 (1)close发送消息
  3. aliyun的maven下载jar的方法
  4. sim卡rfm_信用卡客户的RFM集群
  5. LNMP一键安装shell脚本
  6. 关于设置table样式后,不停点击按钮table中的数据会逐渐被最后一行替换的问题...
  7. 如何在 Gitee 上使用 GPG
  8. 最小树——迪杰斯特拉算法
  9. 亚马逊美国买家账号注册流程
  10. Quartus 软内核NIOS II 入门指导
  11. 奇兔recovery卡刷教程_OPPO A59s 刷入奇兔recovery及root权限刷机教程
  12. vscode设置默认浏览器
  13. 程序员必备的6个好习惯,成为更优秀的自己
  14. 概率论与数理统计前两章总结
  15. 零信任安全和软件定义边界
  16. VR看房:全景图和移动切换的实现
  17. 第十五届全国大学生智能车全国总决赛获奖信息-西部赛区
  18. 微信小程序的开发与原理
  19. 一个普通计算机培训学校学生的迷茫。
  20. LoRa节点开发:5、代码详解LoRaWAN中的几种数据包(发送与接收数据)

热门文章

  1. Prototype 框架分析(一)
  2. Webpack构建多页应用心得体会
  3. Exception in thread “main“ java.lang.NoClassDefFoundError: javax/script/Compilable
  4. git add失效问题以及git status结果与github网页结果不一致(转载+自己整理)
  5. KNN算法与Kd树(转载+代码详细解释)
  6. Non-resolvable parent POM
  7. 4-3 数据离散化(无error版本)
  8. qtp连接mysql 无驱动_QTP连接MySQL
  9. php日期时间代码,PHP日期计算
  10. Resolving Strong Reference Cycles for Closures