日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于android多点触控

發(fā)布時(shí)間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于android多点触控 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近項(xiàng)目需要一個(gè)多點(diǎn)觸控縮放的功能。然后上網(wǎng)查了下資料 總結(jié)一下:

首先android sdk版本很重要,比如你在AndroidManifest.xml中指定android:minSdkVersion="4"? 并且建工程的時(shí)候選的是android 2.2就表示你的應(yīng)用兼容android1.6~android2.2

之間的版本。但是多點(diǎn)觸控的API在1.6~~2,1~~,2,2~~三個(gè)版本中都是不一樣的。比如android2.2中onTouchEvent(MotionEvent event) 這里可以用event.getActionMasked()

表示用于多點(diǎn)觸控檢測(cè)點(diǎn)。但在1.6和2.1中并沒(méi)有event.getActionMasked()這個(gè)方法,查源碼后發(fā)現(xiàn)其實(shí)他就是吧event.getAction()& MotionEvent.ACTION_MASK封裝了一下。

對(duì)于這些小細(xì)節(jié)我們要特別注意,因?yàn)檫@關(guān)乎版本兼容問(wèn)題,也許你在2.2的設(shè)備上運(yùn)行沒(méi)什么問(wèn)題,但1.6或者2.1就會(huì)出個(gè)什么問(wèn)題之類(lèi)的。所以對(duì)于1.6以后新增加的功能,要特別注意API

的使用。1.5就暫不考慮了。

接下來(lái)看代碼:

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 * 游戲畫(huà)布
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 * 翻譯過(guò)來(lái)就是:非第一個(gè)點(diǎn)按下
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 * 表示新的距離比兩個(gè)手指剛觸碰的距離大
50 * ( +10個(gè)像素用來(lái)延遲一下放大,不然稍微動(dòng)一點(diǎn)像素,也放大,感覺(jué)也太快了。)
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 * 表示新的距離比兩個(gè)手指剛觸碰的距離小
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以上的版本 他繼承于我自己寫(xiě)的低版本的GameView。因?yàn)橛泻芏嘀貜?fù)代碼繼承是必須的。最后要注意下:獲取當(dāng)前應(yīng)用的SDK版本代碼為:

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

你需要在最開(kāi)始初始化的時(shí)候運(yùn)行它,寫(xiě)入GameConfig中比較好,后面單例調(diào)用就好了。或者不喜歡單例的直接static final 也行。然后再選擇gameview的時(shí)候 加個(gè)if判斷,

if(sdkVersion<Build.VERSION_CODES.ECLAIR)

{}

else

{}

好了,這里的多點(diǎn)觸控放大比較簡(jiǎn)單,其實(shí)可以根據(jù)前距離/后距離的比值來(lái)動(dòng)態(tài)設(shè)置縮放。這只是個(gè)簡(jiǎn)單的例子。

ps:最近發(fā)現(xiàn) onTouchEvent事件中的參數(shù)MotionEvent,它有一個(gè)getSize()方法。在一個(gè)點(diǎn)的時(shí)候,該方法永遠(yuǎn)返回0,而在兩個(gè)觸電的時(shí)候,該方法則根據(jù)兩點(diǎn)相對(duì)位置變化而返回不同的值?

轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/4712679.html

總結(jié)

以上是生活随笔為你收集整理的关于android多点触控的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。