Я хочу отслеживать скорость движения fingure в пикселях в секунду. Возможно ли какое-нибудь WaY? - PullRequest
4 голосов
/ 22 февраля 2011

Я хочу отслеживать скорость прикосновения, перемещаемую в пикселях / секундах
Любой парень, имеющий идеи для этого

За исключением метода PanGesture

1 Ответ

11 голосов
/ 22 февраля 2011

Я предполагаю, что вы хотите знать скорость между последовательными движениями, а не среднюю величину за серию движений.Теория должна быть достаточно простой для адаптации, если у вас есть другие требования.

Вам нужно знать три вещи:

  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 делает этовещи.Я уверен, что кто-то может исправить это при необходимости!

Удачи, Замораживание.

...