W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
編寫:Andrwyw - 原文:http://developer.android.com/training/gestures/movement.html
本節(jié)課程講述如何追蹤手勢移動。
每當(dāng)當(dāng)前的觸摸位置、壓力、大小發(fā)生變化時,ACTION_MOVE事件都會觸發(fā)onTouchEvent()函數(shù)。正如檢測常用的手勢中描述的那樣,觸摸事件全部都記錄在onTouchEvent()函數(shù)的MotionEvent參數(shù)中。
因為基于手指的觸摸的交互方式并不總是非常精確,所以檢測觸摸事件更多的是基于手勢移動,而非簡單地基于觸摸。為了幫助app區(qū)分基于移動的手勢(如滑動)和非移動手勢(如簡單地點擊),Android引入了“touch slop”的概念。Touch slop是指,在被識別為基于移動的手勢前,用戶觸摸可移動的那一段像素距離。關(guān)于這一主題的更多討論,可以在管理ViewGroup中的觸摸事件中查看。
根據(jù)應(yīng)用的需求,有多種追蹤手勢移動的方式可以選擇。比如:
getHistorical<Value>
系列函數(shù),來獲得事件之前的位置、尺寸、時間以及按壓力(pressures)。當(dāng)我們需要繪制用戶手指痕跡時,歷史狀態(tài)非常有用,比如觸摸繪圖。查看MotionEvent來了解更多細節(jié)。我們可以簡單地用基于距離,或(和)基于手指移動方向的移動手勢。但是速度經(jīng)常也是追蹤手勢特性的一個決定性因素,甚至是判斷一個手勢是否發(fā)生的依據(jù)。為了讓計算速度更容易,Android提供了VelocityTracker類以及Support Library中的VelocityTrackerCompat類。VelocityTracker類可以幫助我們追蹤觸摸事件中的速度因素。如果速度是手勢的一個判斷標(biāo)準(zhǔn),比如快速滑動(fling),那么這些類是很有用的。
下面是一個簡單的例子,說明了VelocityTracker中API函數(shù)的用處。
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: 需要注意的是,我們應(yīng)該在ACTION_MOVE事件,而不是在ACTION_UP事件后計算速度。在ACTION_UP事件之后,計算x、y方向上的速度都會是0。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: