我想追踪手指移动的速度,以每秒像素为单位。有可能吗?有什么方法?

4

我希望能够追踪触摸移动的速度,单位为像素/秒。
有没有任何人有这方面的想法?

除了PanGesture方法。


你能澄清一下你是指速度还是速率吗?例如,如果用户用1秒钟准确地画了一个圆,并在完全相同的像素上结束,你希望答案是a)等于该圆的周长/1秒,还是b)零。请注意,b)的实现将证明要简单得多,但对于直线来说也可以正常工作。 - Dave
实际上我想要的是 ==> 如果我在屏幕上移动手指,那么我需要每秒像素变化率。这可以通过PanGesture提供,但是在iOS 3.2以下版本中不支持Pangesture。请告诉我您是否有任何想法?谢谢回复。 - NIKHIL
@Dave:我希望它在整个屏幕上随机移动。 - NIKHIL
你的应用程序是否使用了NSTimer scheduledTimerWithTimeInterval定期回调?你想要一段时间内的平均速度,还是仅检测到的每个移动的速度?我只是试图弄清楚如何最好地帮助回答你的问题。 - Dave
我需要每个动作的速度。如果您查看平移手势库,那里会有一个函数 - (CGPoint)velocityInView:(UIView *)view; 我希望输出与此类似,因为该方法返回每秒钟的点数变化。 - NIKHIL
1个回答

11

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

您需要知道以下三件事情:

  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的做法还不是非常熟悉。如果有必要,我相信有人可以纠正它!

祝你好运,Freezing。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接