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
- Android事件傳遞、多點觸控及滑動衝突的處理Android事件
- 多點觸控手勢增強軟體Multitouch for MacMac
- Multitouch for Mac(多點觸控手勢增強神器)1.27.14啟用版Mac
- 筆記本觸控板手勢大全 觸控板快捷手勢筆記
- 多點觸控手勢增強神器:Multitouch for Mac v1.27.22免啟用版Mac
- 多點觸控手勢增強神器:Multitouch for Mac v1.27.23免啟用版Mac
- Multitouch for Mac(多點觸控手勢增強神器) v1.20.4免啟用版Mac
- 【朝花夕拾】Android自定義View篇之(八)多點觸控AndroidView
- Mac Air常用觸控手勢使用教程MacAI
- 多點觸控式螢幕驅動
- 觸控板觸控式螢幕禁止手指縮放,這麼處理才行
- 【朝花夕拾】Android自定義View篇之(八)多點觸控(上)MotionEvent簡介AndroidView
- 新鮮出爐:appium2.0+ 單點觸控和多點觸控新的解決方案APP
- archlinux 觸控板手勢配置Linux
- Flutter 手勢處理 & Hero 動畫Flutter動畫
- 安卓觸控手勢翻頁製作電子相簿安卓
- Android處理按鈕重複點選Android
- Scrollow for mac(觸控板手勢工具)1.6.4Mac
- Android 觸控式螢幕驅動Android
- Android觸控事件傳遞機制Android事件
- 設定單點觸控splitMotionEvents
- win10觸控板快捷操作_win10觸控板手勢設定Win10
- 多對一處理 和一對多處理的處理
- Mac觸控板手勢增強工具:MultitouchMac
- thinkpad觸控板手勢win10怎麼設定_win10觸控板手勢設定在哪裡ThinkPadWin10
- 觸控板手勢增強軟體:Multitouch MacMac
- Multitouch for Mac(觸控板手勢增強軟體)Mac
- WPF進階技巧和實戰09-事件(2-多點觸控)事件
- Android中觸控事件的傳遞機制Android事件
- 【Android Developers Training】 67. 響應觸控事件AndroidDeveloperAI事件
- 如何在觸控式螢幕組態軟體上實時監控農村汙水處理PLC
- Android 手勢檢測Android
- Android優雅地處理按鈕重複點選Android
- 觸控板手勢增強軟體:Multitouch Mac版Mac
- 手動執行SQL觸發器id自增報錯處理方式SQL觸發器
- WordPress多站點不支援timthumb.php處理教程PHP
- w10觸控鍵盤無法開啟怎麼處理_win10電腦觸控鍵盤顯示不出來如何恢復Win10
- Omdia:摺疊觸控及蓋板發展趨勢