我想以每秒像素为单位跟踪手指移动的速度是否可能任何等待?

时间:2011-02-22 07:30:04

标签: iphone iphone-sdk-3.0 touch uitouch

我想跟踪以像素/秒为单位移动的触摸速度  任何Budy都有这个想法

除了PanGesture方法

1 个答案:

答案 0 :(得分:11)

我假设你想知道连续运动之间的速度,而不是一系列运动的平均速度。如果你有其他要求,理论应该很容易适应。

您需要了解三件事:

  1. 现在触摸在哪里?
  2. 之前的触摸在哪里?
  3. 从那以后经过了多长时间?
  4. 然后只需使用毕达哥拉斯来获得距离,并按时间划分速度。

    当您收到 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的做事方式仍然不太满意。我敢肯定有人可以在必要时纠正它!

    祝你好运,冻结。