2013-07-04 5 views
8

VelocityTrackerクラスを使用しているときに問題が発生しています。ベロシティトラッキングは、動きのないビューでタッチイベントのベロシティを測定している場合にはうまく機能しているように見えますが、(translateY/XまたはsetY/Xを使用して)ビューを移動するとすぐにベロシティが完全になりますランダム(私は速度がビューの位置を使用して計算されると思います)。ビューをスワイプしたときの動きの正確な速度を得るための提案はありますか?動くビューの速度を追跡する

注: 私は速度の追跡のための私のビューのonTouchListenerからのタッチイベントを使用しています。

乾杯あなたがスケーリングされていないと仮定すると、

答えて

0

、タッチの速度を時間で割った、指が移動した量です。時間は簡単に取得できます。各イベントとサブトレースでシステム時間をミリ秒単位で要求するだけです。翻訳されたビューの場合、同じ参照フレームを使用していることを確認する必要があります。基本的に、ビューセットのxとyのオフセットを翻訳して追跡し、タッチのオフセットをそれに加えて、指の原点を基準にしたトータルのオフセットを取得します。ベロシティトラッキングのためにそれらの数字だけを比較してください。

ビューを拡大縮小する場合は、より複雑になります。スケーリング係数で同じ種類の数学を行う必要があります。基本的にあなたが

+0

OK。それはかなり簡単に聞こえる。私はVelocityTrackerクラスを使い、それを私のためにしたいと思っていましたが、たぶんあなたが言うように私はそれを実装します。 –

8

system.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座標を返します。したがって、あなたが視聴しているビューの動きの影響を受けません。

-1

私はあなたがリアルタイムでアスリートを次のように、カメラの動きについて話していると思います。 もしそうなら、1つの方法しかありません:動きをキャプチャする際には、地面にあるテニスボールのように静止したボールの速度をアスリートの「1つの関節」に差し引く必要があります。 これを行うには、静的オブジェクトの最初と最後のフレームのX、Y座標を取得して、移動するオブジェクトに差異を持たせる必要があります。

移動体:正方形(X位置最終X位置初期値)^ 2 +(Y位置最終Y位置初期値)^ 2) ピクセルをメートルまたはマイルに変換する 次に結果を秒で割りますmilisecondsからの変換が必要です) 移動するオブジェクトにはkm/hとmp/hがあります。

静的オブジェクトのすべてのステップを実行します。 静的オブジェクトから移動オブジェクトに結果を引きます。

ズーム操作でも同様です。 すべての操作は手動です。あなたがリアルタイムで実速度をしたい場合は、アンドロイドに適していない自動トラッキングが必要です。サッカーでは、4台のカメラを使用して、最低3000Mhzのクワッドプロセッサが必要です。私はMatlabを使用するためのアドバイスをしています。

2

絶対座標との取引が書く最も簡単な方法:

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

+0

MotionEventが他の場所で使用されることが予想される場合は、まずMotionEvent.obtain()を使用してそのコピーを作成します。 –

関連する問題