android 處理多點觸控手勢
編寫:Andrwyw - 原文:http://developer.android.com/training/gestures/multi.html
多點觸控手勢是指在同一時間有多點(手指)觸碰螢幕。本節課程講述,如何檢測涉及多點的觸控手勢。
追蹤多點
當多個手指同時觸控螢幕時,系統會產生如下的觸控事件:
- ACTION_DOWN - 針對觸控螢幕的第一個點。此事件是手勢的開端。第一觸控點的資料在MotionEvent中的索引總是0。
- ACTION_POINTER_DOWN - 針對第一點後,出現在螢幕上額外的點。這個點的資料在MotionEvent中的索引,可以通過getActionIndex()獲得。
- ACTION_MOVE - 在按下手勢期間發生變化。
- ACTION_POINTER_UP - 當非主要點(non-primary pointer)離開螢幕時,傳送此事件。
- ACTION_UP - 當最後一點離開螢幕時傳送此事件。
我們可以通過各個點的索引以及id,單獨地追蹤MotionEvent中的每個點。
- Index:MotionEvent把各個點的資訊都儲存在一個陣列中。點的索引值就是它在陣列中的位置。大多數用來與點互動的MotionEvent函式都是以索引值而不是點的ID作為引數的。
- ID:每個點也都有一個ID對映,該ID對映在整個手勢期間一直存在,以便我們單獨地追蹤每個點。
每個獨立的點在移動事件中出現的次序是不固定的。因此,從一個事件到另一個事件,點的索引值是可以改變的,但點的ID在它的生命週期內是保證不會改變的。使用getPointerId()可以獲得一個點的ID,在手勢隨後的移動事件中,就可以用該ID來追蹤這個點。對於隨後一系列的事件,可以使用findPointerIndex()函式,來獲得對應給定ID的點在移動事件中的索引值。如下:
private int mActivePointerId;
public boolean onTouchEvent(MotionEvent event) {
....
// Get the pointer ID
mActivePointerId = event.getPointerId(0);
// ... Many touch events later...
// Use the pointer ID to find the index of the active pointer
// and fetch its position
int pointerIndex = event.findPointerIndex(mActivePointerId);
// Get the pointer's current position
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);
}
獲取MotionEvent的動作
我們應該總是使用getActionMasked()函式(或者用MotionEventCompat.getActionMasked()這個相容版本更好)來獲取MotionEvent的動作(action)。與舊的getAction()函式不同的是,getActionMasked()
是設計用來處理多點觸控的。它會返回執行過的動作的掩碼值,不包括點的索引位。然後,我們可以使用getActionIndex()
來獲得與該動作關聯的點的索引值。這在接下來的程式碼段中可以看到。
Note: 這個樣例使用的是MotionEventCompat類。該類在Support Library中。我們應該使用MotionEventCompat類,來提供對更多平臺的支援。需要注意的一點是,MotionEventCompat並不是MotionEvent類的替代品。準確來說,它提供了一些靜態工具類函式,我們可以把MotionEvent物件作為引數傳遞給這些函式,來得到與事件相關的動作。
int action = MotionEventCompat.getActionMasked(event);
// Get the index of the pointer associated with the action.
int index = MotionEventCompat.getActionIndex(event);
int xPos = -1;
int yPos = -1;
Log.d(DEBUG_TAG,"The action is " + actionToString(action));
if (event.getPointerCount() > 1) {
Log.d(DEBUG_TAG,"Multitouch event");
// The coordinates of the current screen contact, relative to
// the responding View or Activity.
xPos = (int)MotionEventCompat.getX(event, index);
yPos = (int)MotionEventCompat.getY(event, index);
} else {
// Single touch event
Log.d(DEBUG_TAG,"Single touch event");
xPos = (int)MotionEventCompat.getX(event, index);
yPos = (int)MotionEventCompat.getY(event, index);
}
...
// Given an action int, returns a string description
public static String actionToString(int action) {
switch (action) {
case MotionEvent.ACTION_DOWN: return "Down";
case MotionEvent.ACTION_MOVE: return "Move";
case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down";
case MotionEvent.ACTION_UP: return "Up";
case MotionEvent.ACTION_POINTER_UP: return "Pointer Up";
case MotionEvent.ACTION_OUTSIDE: return "Outside";
case MotionEvent.ACTION_CANCEL: return "Cancel";
}
return "";
}
轉自:http://hukai.me/android-training-course-in-chinese/input/gestures/multi.html
相關文章
- 多點觸控手勢增強神器:Multitouch for MacMac
- 多點觸控手勢增強軟體Multitouch for MacMac
- Android 多點觸控介面Android
- 【Unity】unity3d FingerGestures 單點 多點觸控 手勢Unity3D
- Android事件傳遞、多點觸控及滑動衝突的處理Android事件
- Android 觸控事件處理機制Android事件
- Multitouch for Mac(多點觸控手勢增強神器)1.27.14啟用版Mac
- android 自定義ImageView實現圖片手勢滑動,多點觸控放大縮小效果AndroidView
- 筆記本觸控板手勢大全 觸控板快捷手勢筆記
- scaleform mobile sdk for android 多點觸控 修正ORMAndroid
- Multitouch for Mac(多點觸控手勢增強神器) v1.20.4免啟用版Mac
- 多點觸控手勢增強神器:Multitouch for Mac v1.27.23免啟用版Mac
- 多點觸控手勢增強神器:Multitouch for Mac v1.27.22免啟用版Mac
- Mac Air常用觸控手勢使用教程MacAI
- 【朝花夕拾】Android自定義View篇之(八)多點觸控AndroidView
- 多點觸控式螢幕驅動
- 手勢魅力-設定一個觸控選單
- Flutter 手勢處理 & Hero 動畫Flutter動畫
- android 多手勢識別Android
- 觸控板觸控式螢幕禁止手指縮放,這麼處理才行
- 安卓觸控手勢翻頁製作電子相簿安卓
- 新鮮出爐:appium2.0+ 單點觸控和多點觸控新的解決方案APP
- Android觸控事件(續)——點選長按事件Android事件
- Android觸控事件傳遞機制及viewpager巢狀fragment衝突處理Android事件Viewpager巢狀Fragment
- 【朝花夕拾】Android自定義View篇之(八)多點觸控(上)MotionEvent簡介AndroidView
- iOS開發系列--觸控事件、手勢識別、搖晃事件、耳機線控iOS事件
- iOS開發學習之觸控事件和手勢識別iOS事件
- Hammer.js 移動裝置觸控手勢js庫JS
- cocos2d-x畫素級觸控處理
- Scrollow for mac(觸控板手勢工具)1.6.4Mac
- lenovothinkpadt460sopensuselinux下禁用多點觸控屏ThinkPadLinux
- win10觸控板快捷操作_win10觸控板手勢設定Win10
- Mac觸控板手勢增強工具:MultitouchMac
- 設定單點觸控splitMotionEvents
- android遊戲開發(二)觸屏事件處理薦Android遊戲開發事件
- 多對一處理 和一對多處理的處理
- Android觸控事件的應用Android事件
- thinkpad觸控板手勢win10怎麼設定_win10觸控板手勢設定在哪裡ThinkPadWin10