本課程將說明如何追蹤觸控事件的動作。
新的
onTouchEvent()
敬上
是透過
ACTION_MOVE
事件
。阿斯
詳情請見「偵測常用手勢」一文
這些事件都會記錄在
MotionEvent
參數隸屬於
onTouchEvent()
。
因為手指式觸控不一定是最精確的互動形式 偵測觸控事件通常源自動作,而非單純的接觸。 協助應用程式區分使用者動作手勢 (例如滑動) 與 使用者只要輕輕一按,Android 就會提供非移動手勢 觸控筆。觸控手勢是指使用者輕觸可設定的距離 (以像素為單位) 系統將其視為動作手勢。如要 如要瞭解這個主題的資訊,請參閱「管理 ViewGroup。
手勢有多種追蹤方式,具體情況取決於 應用程式的需求範例如下:
- 指標的開始和結束位置,例如移動螢幕上的位置 物件。
- 指標行進的方向,由 X 和 Y 決定 座標。
- 。如要查看手勢歷史記錄的大小,請呼叫
MotionEvent
種方式getHistorySize()
。 以便取得每個 Pod 的位置、大小、時間和壓力 建立歷史事件getHistorical<Value>
方法。如要顯示使用者的手指軌跡,紀錄功能就能派上用場,例如 以及觸控繪圖的功能詳情請參閱MotionEvent
參考資料。 - 指標在觸控螢幕上移動時的速度。
請參閱下列相關資源:
追蹤速度
您可以擁有以距離或方向為基礎的移動手勢
指標移動。不過,速度通常是在
手勢的特性,或判斷該手勢是否發生。要求
Android 提供了
VelocityTracker
類別。
VelocityTracker
可協助您追蹤觸控事件的速度。這很實用
適用於速度是手勢條件之一的手勢,例如
快速滑過
以下例子說明
VelocityTracker
API:
Kotlin
private const val DEBUG_TAG = "Velocity" class MainActivity : Activity() { private var mVelocityTracker: VelocityTracker? = null override fun onTouchEvent(event: MotionEvent): Boolean { when (event.actionMasked) { MotionEvent.ACTION_DOWN -> { // Reset the velocity tracker back to its initial state. mVelocityTracker?.clear() // If necessary, retrieve a new VelocityTracker object to watch // the velocity of a motion. mVelocityTracker = mVelocityTracker ?: VelocityTracker.obtain() // Add a user's movement to the tracker. mVelocityTracker?.addMovement(event) } MotionEvent.ACTION_MOVE -> { mVelocityTracker?.apply { val pointerId: Int = event.getPointerId(event.actionIndex) addMovement(event) // When you want to determine the velocity, call // computeCurrentVelocity(). Then, call getXVelocity() and // getYVelocity() to retrieve the velocity for each pointer // ID. computeCurrentVelocity(1000) // Log velocity of pixels per second. It's best practice to // use VelocityTrackerCompat where possible. Log.d("", "X velocity: ${getXVelocity(pointerId)}") Log.d("", "Y velocity: ${getYVelocity(pointerId)}") } } MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { // Return a VelocityTracker object back to be re-used by others. mVelocityTracker?.recycle() mVelocityTracker = null } } return true } }
Java
public class MainActivity extends Activity { private static final String DEBUG_TAG = "Velocity"; ... private VelocityTracker mVelocityTracker = null; @Override public boolean onTouchEvent(MotionEvent event) { int index = event.getActionIndex(); int action = event.getActionMasked(); int pointerId = event.getPointerId(index); switch(action) { case MotionEvent.ACTION_DOWN: if(mVelocityTracker == null) { // Retrieve a new VelocityTracker object to watch the // velocity of a motion. mVelocityTracker = VelocityTracker.obtain(); } else { // Reset the velocity tracker back to its initial state. mVelocityTracker.clear(); } // Add a user's movement to the tracker. mVelocityTracker.addMovement(event); break; case MotionEvent.ACTION_MOVE: mVelocityTracker.addMovement(event); // When you want to determine the velocity, call // computeCurrentVelocity(). Then call getXVelocity() and // getYVelocity() to retrieve the velocity for each pointer ID. mVelocityTracker.computeCurrentVelocity(1000); // Log velocity of pixels per second. It's best practice to use // VelocityTrackerCompat where possible. Log.d("", "X velocity: " + mVelocityTracker.getXVelocity(pointerId)); Log.d("", "Y velocity: " + mVelocityTracker.getYVelocity(pointerId)); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: // Return a VelocityTracker object back to be re-used by others. mVelocityTracker.recycle(); break; } return true; } }
使用指標擷取功能
部分應用程式 (例如遊戲以及遠端桌面和虛擬化用戶端) 能從中受益 以控制滑鼠遊標指標拍攝功能 適用於 Android 8.0 (API 級別 26) 以上版本。 將所有滑鼠事件傳送到應用程式中的聚焦檢視畫面。
要求指標擷取
應用程式中的檢視畫面只有在檢視區塊階層符合下列條件時,才能要求擷取指標:
含有焦點因此,如果收到要求指標
資料檢視上的特定使用者動作,例如
onClick()
敬上
活動,或
onWindowFocusChanged()
。
活動的事件處理常式。
如要要求指標擷取,請呼叫
requestPointerCapture()
敬上
方法。以下程式碼範例顯示如何要求指標
系統會在使用者點擊觀看時記錄:
Kotlin
fun onClick(view: View) { view.requestPointerCapture() }
Java
@Override public void onClick(View view) { view.requestPointerCapture(); }
擷取指標的要求成功後,Android 就會呼叫
onPointerCaptureChange(true)
。
只要遊標符合以下條件,系統就會把滑鼠事件傳送到應用程式中的焦點。
這類檢視區塊與要求擷取的檢視區塊階層相同。其他
應用程式會在擷取釋出前停止接收滑鼠事件,包括
ACTION_OUTSIDE
敬上
事件。Android 會從滑鼠以外的來源傳送指標事件
但不會再顯示滑鼠遊標。
處理擷取的指標事件
檢視區塊成功擷取指標擷取後,Android 就會 滑鼠事件。您的焦點檢視畫面可以執行下列任一操作,來處理事件: 幾項工作:
- 如果您使用自訂檢視畫面,請覆寫
onCapturedPointerEvent(MotionEvent)
。 - 否則,請註冊
OnCapturedPointerListener
。
以下程式碼範例顯示
onCapturedPointerEvent(MotionEvent)
:
Kotlin
override fun onCapturedPointerEvent(motionEvent: MotionEvent): Boolean { // Get the coordinates required by your app. val verticalOffset: Float = motionEvent.y // Use the coordinates to update your view and return true if the event is // successfully processed. return true }
Java
@Override public boolean onCapturedPointerEvent(MotionEvent motionEvent) { // Get the coordinates required by your app. float verticalOffset = motionEvent.getY(); // Use the coordinates to update your view and return true if the event is // successfully processed. return true; }
以下程式碼範例顯示如何註冊
OnCapturedPointerListener
:
Kotlin
myView.setOnCapturedPointerListener { view, motionEvent -> // Get the coordinates required by your app. val horizontalOffset: Float = motionEvent.x // Use the coordinates to update your view and return true if the event is // successfully processed. true }
Java
myView.setOnCapturedPointerListener(new View.OnCapturedPointerListener() { @Override public boolean onCapturedPointer (View view, MotionEvent motionEvent) { // Get the coordinates required by your app. float horizontalOffset = motionEvent.getX(); // Use the coordinates to update your view and return true if the event is // successfully processed. return true; } });
無論是使用自訂檢視區塊或註冊事件監聽器,您的檢視區塊都會收到
MotionEvent
,帶有指標座標,用於指定相對移動 (例如 X)
,類似於軌跡球裝置提供的座標。你可以
擷取座標
getX()
和
getY()
。
版本指標擷取
應用程式中的檢視畫面可藉由呼叫
releasePointerCapture()
、
如以下程式碼範例所示:
Kotlin
override fun onClick(view: View) { view.releasePointerCapture() }
Java
@Override public void onClick(View view) { view.releasePointerCapture(); }
因為系統可能會在沒有你明確指示的情況下,擅自取下相片。
呼叫 releasePointerCapture()
,這通常是因為檢視區塊階層
包含要求擷取的檢視畫面失去焦點。