4

ピクセル単位で移動したタッチの速度を追跡したい/秒
これについてアイデアを持っているバディ

PanGestureメソッドを除く

4

1 に答える 1

11

一連の動きの平均ではなく、連続する動きの間の速度を知りたいと仮定します。ただし、他の要件がある場合、理論は簡単に適応できるはずです。

次の3つのことを知っておく必要があります。

  1. タッチは今どこにありますか?
  2. 以前はどこに触れていましたか?
  3. それからどれくらいの時間が経ちましたか?

次に、ピタゴラスを使用して距離を取得し、時間で割って速度を求めます。

touchesMovedイベントを取得すると、現在および以前の位置が提供されます。次に追加する必要があるのは、時間の測定です。

そのためには、クラスのNSDateプロパティが時間間隔の計算に役立つようにする必要があります。viewDidLoad / viewDidUnload、または同様の場所で初期化して解放できます。私の例では、私のものはlastTouchTimeと呼ばれ、保持され、次のように初期化されています。

self.lastTouchTime = [NSDate date];

そして私はそれを予測可能な方法でリリースします。

touchesMovedイベントは、のようになります。

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{       

    NSArray *touchesArray = [touches allObjects];
    UITouch *touch;
    CGPoint ptTouch;
    CGPoint ptPrevious;

    NSDate *now = [[NSDate alloc] init];
    NSTimeInterval interval = [now timeIntervalSinceDate:lastTouchTime];
    [lastTouchTime release];
    lastTouchTime = [[NSDate alloc] init];
    [now release];

    touch = [touchesArray objectAtIndex:0];
    ptTouch = [touch locationInView:self.view];
    ptPrevious = [touch previousLocationInView:self.view];

    CGFloat xMove = ptTouch.x - ptPrevious.x;
    CGFloat yMove = ptTouch.y - ptPrevious.y;
    CGFloat distance = sqrt ((xMove * xMove) + (yMove * yMove));

    NSLog (@"TimeInterval:%f", interval);
    NSLog (@"Move:%5.2f, %5.2f", xMove, yMove);
    NSLog (@"Distance:%5.2f", distance);
    NSLog (@"Speed:%5.2f", distance / interval);
}

申し訳ありませんが、メモリ管理を使って偽物を作ったとしても、ObjectiveCのやり方にはまだあまり慣れていません。必要に応じて誰かが修正できると確信しています!

頑張って、凍えそうに。

于 2011-02-22T20:35:23.420 に答える