android 追蹤手勢移動
編寫:Andrwyw - 原文:http://developer.android.com/training/gestures/movement.html
本節課程講述如何追蹤手勢移動。
每當當前的觸控位置、壓力、大小發生變化時,ACTION_MOVE事件都會觸發onTouchEvent()函式。正如檢測常用的手勢中描述的那樣,觸控事件全部都記錄在onTouchEvent()函式的MotionEvent引數中。
因為基於手指的觸控的互動方式並不總是非常精確,所以檢測觸控事件更多的是基於手勢移動,而非簡單地基於觸控。為了幫助app區分基於移動的手勢(如滑動)和非移動手勢(如簡單地點選),Android引入了“touch slop”的概念。Touch slop是指,在被識別為基於移動的手勢前,使用者觸控可移動的那一段畫素距離。關於這一主題的更多討論,可以在管理ViewGroup中的觸控事件中檢視。
根據應用的需求,有多種追蹤手勢移動的方式可以選擇。比如:
- 追蹤手指的起始和終止位置(比如,把螢幕上的物件從A點移動到B點)
- 根據x、y軸座標,追蹤手指移動的方向。
- 追蹤歷史狀態。我們可以通過呼叫MotionEvent的getHistorySize()方法,來獲得一個手勢的歷史尺寸。我們可以通過移動事件的
getHistorical<Value>
系列函式,來獲得事件之前的位置、尺寸、時間以及按壓力(pressures)。當我們需要繪製使用者手指痕跡時,歷史狀態非常有用,比如觸控繪圖。檢視MotionEvent來了解更多細節。 - 追蹤手指在觸控式螢幕上滑過的速度。
追蹤速度
我們可以簡單地用基於距離,或(和)基於手指移動方向的移動手勢。但是速度經常也是追蹤手勢特性的一個決定性因素,甚至是判斷一個手勢是否發生的依據。為了讓計算速度更容易,Android提供了VelocityTracker類以及Support Library中的VelocityTrackerCompat類。VelocityTracker類可以幫助我們追蹤觸控事件中的速度因素。如果速度是手勢的一個判斷標準,比如快速滑動(fling),那麼這些類是很有用的。
下面是一個簡單的例子,說明了VelocityTracker中API函式的用處。
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
// Best practice to use VelocityTrackerCompat where possible.
Log.d("", "X velocity: " +
VelocityTrackerCompat.getXVelocity(mVelocityTracker,
pointerId));
Log.d("", "Y velocity: " +
VelocityTrackerCompat.getYVelocity(mVelocityTracker,
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;
}
}
Note: 需要注意的是,我們應該在ACTION_MOVE事件,而不是在ACTION_UP事件後計算速度。在ACTION_UP事件之後,計算x、y方向上的速度都會是0。
轉自:http://hukai.me/android-training-course-in-chinese/input/gestures/movement.html
相關文章
- 三星Gear VR最大亮點:將實現手勢追蹤VR
- SQL追蹤和事件追蹤SQL事件
- 如何追蹤laravel動態Laravel
- 如何追蹤Java動態Java
- 如何追蹤vue動態Vue
- 如何追蹤Go動態Go
- 如何追蹤Python動態Python
- 如何追蹤laravel動態<二>Laravel
- android 滾動手勢動畫Android動畫
- Java動態追蹤技術探究Java
- 淺談動態追蹤技術
- Blazor Bootstrap 元件庫地理定位/移動距離追蹤元件介紹Blazorboot元件
- 日誌追蹤
- 程式碼追蹤
- 微軟Win10手機增加感測器 改進運動追蹤功能微軟Win10
- 諾基亞智慧手錶Withings Go正式釋出:主打運動追蹤Go
- 追蹤將伺服器CPU耗光的兇手伺服器
- js實現移動端圖片預覽:手勢縮放, 手勢拖動,雙擊放大...JS
- 移動端手勢庫設計與實踐
- OpenTelemetry分散式追蹤分散式
- 手勢檢測跟蹤解決方案
- 追蹤解析Spring ioc啟動原始碼(2)Spring原始碼
- Klokki for mac(自動時間追蹤管理軟體)Mac
- Level智慧眼鏡:內建運動追蹤功能
- 動態追蹤技術(中) - Dtrace、SystemTap、火焰圖
- 飛利浦Health Watch智慧手錶曝光 可追蹤慢性疾病
- eMarketer:英國的智慧手機使用者警惕被追蹤
- 超越按鈕 - 談手勢驅動的移動介面設計
- flutter系列之:移動端手勢的具體使用Flutter
- 微服務追蹤SQL(支援Isto管控下的gorm查詢追蹤)微服務SQLGoORM
- OMsignal智慧運動內衣:追蹤穿戴者系列運動指數
- 追蹤解析 Disruptor 原始碼原始碼
- Debug追蹤eclipseEclipse
- 路由追蹤命令詳解路由
- oracle追蹤誤操作DDLOracle
- go的鏈路追蹤Go
- 使用 Unity 開發 Android 遊戲時如何追蹤效能問題UnityAndroid遊戲
- 金州勇士隊採用可眼動追蹤VR頭顯,檢測球員的傷勢情況VR