VelocityTracker顧名思義即速度跟蹤,在android中主要應用於touch even。, VelocityTracker通過跟蹤一連串事件實時計算出當前的速度,這樣的用法在android系統空間中隨處可見,比如Gestures中的Fling, Scrolling等。
android.view.VelocityTracker主要用跟蹤觸摸屏事件(flinging事件和其他gestures手勢事件)的速率。用addMovement(MotionEvent)函數將Motion event加入到VelocityTracker類實例中.你可以使用getXVelocity() 或getXVelocity()獲得橫向和豎向的速率到速率時,但是使用它們之前請先調用computeCurrentVelocity(int)來初始化速率的單位 。
主要函數
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
Add a user's movement to the tracker. |
||||||||||
|
Reset the velocity tracker back to its initial state. |
||||||||||
|
Compute the current velocity based on the points that have been collected. intunitis表示速率的基本時間單位。unitis值爲1的表示是,一毫秒時間單位內運動了多少個像素, unitis值爲1000表示一秒(1000毫秒)時間單位內運動了多少個像素 floatVelocity表示速率的最大值 |
||||||||||
|
Equivalent to invoking |
||||||||||
|
|
||||||||||
|
Retrieve the last computed X velocity. |
||||||||||
|
Retrieve the last computed X velocity. |
||||||||||
|
Retrieve the last computed Y velocity. |
||||||||||
|
Retrieve the last computed Y velocity. |
||||||||||
|
|
||||||||||
|
Retrieve a new VelocityTracker object to watch the velocity of a motion. |
||||||||||
|
Return a VelocityTracker object back to be re-used by others. |
||||||||||
|
|
||||||||||
|
|
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
private VelocityTracker mVelocityTracker; //生命變量 //在onTouchEvent(MotionEvent ev)中 if (mVelocityTracker == null ) { mVelocityTracker = VelocityTracker.obtain(); //獲得VelocityTracker類實例 } mVelocityTracker.addMovement(ev); //將事件加入到VelocityTracker類實例中 //判斷當ev事件是MotionEvent.ACTION_UP時:計算速率 final VelocityTracker velocityTracker = mVelocityTracker; // 1000 provides pixels per second velocityTracker.computeCurrentVelocity(1, (float)0.01); //設置maxVelocity值爲0.1時,速率大於0.01時,顯示的速率都是0.01,速率小於0.01時,顯示正常 Log.i( "test" , "velocityTraker" +velocityTracker.getXVelocity()); velocityTracker.computeCurrentVelocity(1000); //設置units的值爲1000,意思爲一秒時間內運動了多少個像素 Log.i( "test" , "velocityTraker" +velocityTracker.getXVelocity()); |
大體的使用是這樣的:
當你需要跟蹤觸摸屏事件的速度的時候,使用obtain()方法來獲得VelocityTracker類的一個實例對象
在onTouchEvent回調函數中,使用addMovement(MotionEvent)函數將當前的移動事件傳遞給VelocityTracker對象
使用computeCurrentVelocity (int units)函數來計算當前的速度,使用getXVelocity ()、 getYVelocity ()函數來獲得當前的速度
下面是我寫的一個簡單Demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
package com.bxwu.demo.component.activity; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.ViewConfiguration; import android.view.ViewGroup.LayoutParams; import android.widget.TextView; public class VelocityTrackerTest extends Activity { private TextView mInfo; private VelocityTracker mVelocityTracker; private int mMaxVelocity; private int mPointerId; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); mInfo = new TextView( this ); mInfo.setLines(4); mInfo.setLayoutParams( new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); mInfo.setTextColor(Color.WHITE); setContentView(mInfo); mMaxVelocity = ViewConfiguration.get( this ).getMaximumFlingVelocity(); } @Override public boolean onTouchEvent(MotionEvent event) { final int action = event.getAction(); acquireVelocityTracker(event); final VelocityTracker verTracker = mVelocityTracker; switch (action) { case MotionEvent.ACTION_DOWN: //求第一個觸點的id, 此時可能有多個觸點,但至少一個 mPointerId = event.getPointerId(0); break ; case MotionEvent.ACTION_MOVE: //求僞瞬時速度 verTracker.computeCurrentVelocity(1000, mMaxVelocity); final float velocityX = verTracker.getXVelocity(mPointerId); final float velocityY = verTracker.getYVelocity(mPointerId); recodeInfo(velocityX, velocityY); break ; case MotionEvent.ACTION_UP: releaseVelocityTracker(); break ; case MotionEvent.ACTION_CANCEL: releaseVelocityTracker(); break ; default : break ; } return super .onTouchEvent(event); } /** * * @param event 向VelocityTracker添加MotionEvent * * @see android.view.VelocityTracker#obtain() * @see android.view.VelocityTracker#addMovement(MotionEvent) */ private void acquireVelocityTracker(final MotionEvent event) { if ( null == mVelocityTracker) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); } /** * 釋放VelocityTracker * * @see android.view.VelocityTracker#clear() * @see android.view.VelocityTracker#recycle() */ private void releaseVelocityTracker() { if ( null != mVelocityTracker) { mVelocityTracker.clear(); mVelocityTracker.recycle(); mVelocityTracker = null ; } } private static final String sFormatStr = "velocityX=%f\nvelocityY=%f" ; /** * 記錄當前速度 * * @param velocityX x軸速度 * @param velocityY y軸速度 */ private void recodeInfo(final float velocityX, final float velocityY) { final String info = String.format(sFormatStr, velocityX, velocityY); mInfo.setText(info); } } |
代碼很簡單,我們可以求出move過程中的僞瞬時速度, 這樣在做很多控件的時候都是可以用到的,比如系統Launcher的分頁,
ScrollView滑動等, 可根據此時的速度來計算ACTION_UP後的減速運動等。實現一些非常棒的效果。