关于android多点触控

简介:

原文:http://www.cnblogs.com/tianjian/archive/2011/12/01/2270657.html

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

首先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就暂不考虑了。

接下来看代码:

package laahaa.framework;
 
 
 
 import android.content.Context;
 import android.graphics.PointF;
 import android.util.AttributeSet;
 import android.util.FloatMath;
 import android.view.MotionEvent;
 import android.view.SurfaceHolder;
 
 /**
  * 
  * 游戏画布
  */
 public class GameView2X extends GameView implements SurfaceHolder.Callback {
 
     private float oldDist;
     private PointF midPoint = new PointF();
     private boolean isZoom = false;
 
     public GameView2X(Context context, AttributeSet attrs) {
         super(context, attrs);
 
     }
 
     public boolean onTouchEvent(MotionEvent event) {
 
         switch (event.getAction() & MotionEvent.ACTION_MASK) {
         case MotionEvent.ACTION_DOWN:
             super.actionDown(event);
             break;
         case MotionEvent.ACTION_POINTER_UP:
             isZoom = false;
             break;
         /**
          * API原文是 A non-primary pointer has gone down.
          * 翻译过来就是:非第一个点按下
 */
         case MotionEvent.ACTION_POINTER_DOWN:
             oldDist = spacing(event);
             midPoint(midPoint, event);
             isZoom = true;
             break;
         case MotionEvent.ACTION_MOVE:
             if (isZoom) {
                 float newDist = spacing(event);
                 /**
                  * 表示新的距离比两个手指刚触碰的距离大
                  * ( +10个像素用来延迟一下放大,不然稍微动一点像素,也放大,感觉也太快了。)
 */            
                 if (newDist + 10 > oldDist) {
                     super.getGameThread().getGameDraw()
                             .checkXY((int) midPoint.x, (int) midPoint.y);
                     super.getGameThread().getGameDraw().setIsZoom(true);
                 }
                 /**
                  * 表示新的距离比两个手指刚触碰的距离小
 */    
                 if (newDist + 10 < oldDist) {
                     super.getGameThread().getGameDraw().setIsZoom(false);
                     GameDraw.newX = 0;
                     GameDraw.newY = 0;
                 }
             }
             super.actionMove(event);
 
             break;
         }
 
         return true;
     }
 
     private float spacing(MotionEvent event) {
         float x = event.getX(0) - event.getX(1);
         float y = event.getY(0) - event.getY(1);
         return FloatMath.sqrt(x * x + y * 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);
     }
 }

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







相关文章
|
4月前
|
Java Android开发
Android Studio入门之按钮触控的解析及实战(附源码 超详细必看)(包括按钮控件、点击和长按事件、禁用与恢复按钮)
Android Studio入门之按钮触控的解析及实战(附源码 超详细必看)(包括按钮控件、点击和长按事件、禁用与恢复按钮)
182 0
|
4月前
|
XML Java Android开发
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)
36 0
|
9月前
|
Android开发 iOS开发 Windows
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
无影ios & Android客户端6.0.0版本发布!移动端触控体验更舒适,用户操作更便捷,一起来看看!
678 0
无影产品动态|iOS & Android客户端6.0.0版本发布,提升触控灵敏度,操作体验更丝滑
|
存储 Android开发 索引
【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
317 0
|
Android开发 索引 存储
Android官方开发文档Training系列课程中文版:手势处理之多点触控处理
原文地址:http://android.xsoftlab.net/training/gestures/multi.html 多点触控是指多个手指同时触摸屏幕的情况。这节课主要学习如何检测多点触控手势。
878 0