滑動動速度跟蹤類VelocityTracker介紹

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
void addMovement(MotionEventevent)

Add a user's movement to the tracker.

void clear()

Reset the velocity tracker back to its initial state.

void computeCurrentVelocity(int units, float maxVelocity)

Compute the current velocity based on the points that have been collected.

intunitis表示速率的基本時間單位。unitis值爲1的表示是,一毫秒時間單位內運動了多少個像素, unitis值爲1000表示一秒(1000毫秒)時間單位內運動了多少個像素

floatVelocity表示速率的最大值

void computeCurrentVelocity(int units)

Equivalent to invoking computeCurrentVelocity(int, float)with a maximum velocity of Float.MAX_VALUE.

abstract T getNextPoolable()
float getXVelocity()

Retrieve the last computed X velocity.

float getXVelocity(int id)

Retrieve the last computed X velocity.

float getYVelocity(int id)

Retrieve the last computed Y velocity.

float getYVelocity()

Retrieve the last computed Y velocity.

abstract boolean isPooled()
static VelocityTracker obtain()

Retrieve a new VelocityTracker object to watch the velocity of a motion.

void recycle()

Return a VelocityTracker object back to be re-used by others.

abstract void setNextPoolable(T element)
abstract void setPooled(boolean isPooled)

 

示例:

 

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後的減速運動等。實現一些非常棒的效果。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章