2013-07-04 74 views
8

我在使用VelocityTracker類時遇到了問題。如果您正在測量非移動視圖上的觸摸事件的速度,則速度跟蹤似乎效果很好,但只要視圖開始隨手指移動(使用translateY/X或setY/X),速度就會完全隨機(我認爲速度是使用視圖的位置計算的?)。有沒有人有任何建議讓您在滑動視圖時獲得準確的運動速度?跟蹤移動視圖的速度

說明: 我正在使用View的onTouchListener中的觸摸事件進行速度跟蹤。

乾杯

回答

0

假設你不結垢,觸摸的速度是你的手指移動的量,除以時間。時間很容易得到 - 只需要在毫秒中對每個事件請求系統時間並進行減法運算。對於翻譯的視圖,你想確保你使用相同的參照系。基本上通過翻譯它來跟蹤視圖集的x和y偏移量,並將觸摸的偏移量添加到它以獲得手指相對於原點的總偏移量。只比較這些數字進行速度跟蹤。

如果您也在縮放視圖,它會變得更加複雜。你需要用縮放因子來做同樣的數學運算。基本上,您將所有點轉換爲相同的參考系統。q

+0

確定。這聽起來很容易。我希望能夠使用VelocityTracker類,並且爲我完成了它,但是也許我會像你說的那樣自己實現它。 –

8

您應該跟蹤視圖已移動了多少,並在將其傳遞到VelocityTracker之前先調用MotionEvent.offsetLocation以「修復」事件座標。

private float mLastX; 
private float mTranslationX; 
private VelocityTracker mTracker; 

@Override 
public boolean onTouch(final View view, MotionEvent motionEvent) { 
    motionEvent.offsetLocation(mTranslationX, 0); 

    switch (motionEvent.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: 
     mLastX = motionEvent.getRawX(); 
     mTracker = VelocityTracker.obtain(); 
     mTracker.addMovement(motionEvent); 
     return true; 

    case MotionEvent.ACTION_MOVE: 
     mTranslationX += motionEvent.getRawX() - mLastX; 
     view.setTranslationX(mTranslationX); 
     mTracker.addMovement(motionEvent); 
     return true; 

    case MotionEvent.ACTION_UP: 
     // get your correct velocity from mTracker 
     ... 
    } 
} 

退房的文檔MotionEvent.getRawX/Y了。

它們返回指針相對於整個屏幕的X/Y座標,因此它們不受任何View的移動影響。

-1

我想你是在談論相機運動,就像跟蹤運動員的實時。 如果是這樣,只有一種方法:在捕捉運動過程中,需要一個固定點,比如地面的網球,以便將靜態球的速度減去運動員的「一個關節」。 要做到這一點,需要獲取靜態物體的初始幀和最終幀中的X,Y座標,以便與運動物體產生差異。移動物體:方形((X位置最終-X位置初始)^ 2 +(Y位置最終-Y位置初始)^ 2) 然後將像素轉換爲米或英里 然後將結果除以秒需要從毫秒轉換) 你得到運動物體的km/h和mp/h。

執行靜態對象的所有步驟。 將靜態對象的結果減去運動對象。

這同樣適用於縮放操作。 所有的操作都是手動的。如果你想要實時的實時速度,你需要自動跟蹤不適合android。在足球方面,使用4臺攝像機需要至少3000Mhz的四處理器。我建議使用Matlab。

2

與絕對座標的最簡單的方式處理寫:

motionEvent.setLocation(e.getRawX(), e.getRawY());

+0

如果您希望在其他地方使用MotionEvent,請使用MotionEvent.obtain()首先製作它的副本。 –