我在使用VelocityTracker類時遇到了問題。如果您正在測量非移動視圖上的觸摸事件的速度,則速度跟蹤似乎效果很好,但只要視圖開始隨手指移動(使用translateY/X或setY/X),速度就會完全隨機(我認爲速度是使用視圖的位置計算的?)。有沒有人有任何建議讓您在滑動視圖時獲得準確的運動速度?跟蹤移動視圖的速度
說明: 我正在使用View的onTouchListener中的觸摸事件進行速度跟蹤。
乾杯
我在使用VelocityTracker類時遇到了問題。如果您正在測量非移動視圖上的觸摸事件的速度,則速度跟蹤似乎效果很好,但只要視圖開始隨手指移動(使用translateY/X或setY/X),速度就會完全隨機(我認爲速度是使用視圖的位置計算的?)。有沒有人有任何建議讓您在滑動視圖時獲得準確的運動速度?跟蹤移動視圖的速度
說明: 我正在使用View的onTouchListener中的觸摸事件進行速度跟蹤。
乾杯
假設你不結垢,觸摸的速度是你的手指移動的量,除以時間。時間很容易得到 - 只需要在毫秒中對每個事件請求系統時間並進行減法運算。對於翻譯的視圖,你想確保你使用相同的參照系。基本上通過翻譯它來跟蹤視圖集的x和y偏移量,並將觸摸的偏移量添加到它以獲得手指相對於原點的總偏移量。只比較這些數字進行速度跟蹤。
如果您也在縮放視圖,它會變得更加複雜。你需要用縮放因子來做同樣的數學運算。基本上,您將所有點轉換爲相同的參考系統。q
您應該跟蹤視圖已移動了多少,並在將其傳遞到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的移動影響。
我想你是在談論相機運動,就像跟蹤運動員的實時。 如果是這樣,只有一種方法:在捕捉運動過程中,需要一個固定點,比如地面的網球,以便將靜態球的速度減去運動員的「一個關節」。 要做到這一點,需要獲取靜態物體的初始幀和最終幀中的X,Y座標,以便與運動物體產生差異。移動物體:方形((X位置最終-X位置初始)^ 2 +(Y位置最終-Y位置初始)^ 2) 然後將像素轉換爲米或英里 然後將結果除以秒需要從毫秒轉換) 你得到運動物體的km/h和mp/h。
執行靜態對象的所有步驟。 將靜態對象的結果減去運動對象。
這同樣適用於縮放操作。 所有的操作都是手動的。如果你想要實時的實時速度,你需要自動跟蹤不適合android。在足球方面,使用4臺攝像機需要至少3000Mhz的四處理器。我建議使用Matlab。
與絕對座標的最簡單的方式處理寫:
motionEvent.setLocation(e.getRawX(), e.getRawY());
如果您希望在其他地方使用MotionEvent,請使用MotionEvent.obtain()首先製作它的副本。 –
確定。這聽起來很容易。我希望能夠使用VelocityTracker類,並且爲我完成了它,但是也許我會像你說的那樣自己實現它。 –