Iphone 将手势转换为速度
我在看一些代码,基本上有一行图像,你在这行上滑动,卡片图像根据滑动在这行中移动。就像你给它一个轻弹,然后它在列表中向下移动5张牌。你轻弹一下,然后在列表中下移一张牌。它还可以输入卡号,比如如果你从卡1开始,想进入卡52,你输入52,它滚动所有51张卡,到达卡52并停止。滑动手势和goToCard代码都调用以下方法:Iphone 将手势转换为速度,iphone,algorithm,physics,Iphone,Algorithm,Physics,我在看一些代码,基本上有一行图像,你在这行上滑动,卡片图像根据滑动在这行中移动。就像你给它一个轻弹,然后它在列表中向下移动5张牌。你轻弹一下,然后在列表中下移一张牌。它还可以输入卡号,比如如果你从卡1开始,想进入卡52,你输入52,它滚动所有51张卡,到达卡52并停止。滑动手势和goToCard代码都调用以下方法: - (void)doAnimation { double elapsed = CACurrentMediaTime() - startTime; if
- (void)doAnimation {
double elapsed = CACurrentMediaTime() - startTime;
if (elapsed >= runDelta) [self endAnimation];
else {
[self updateAnimationAtTime:elapsed];
}
}
- (void)updateAnimationAtTime:(double)elapsed
{
int max = 52;
if (elapsed > runDelta) elapsed = runDelta;
double delta = fabs(startSpeed) * elapsed - FRICTION * elapsed * elapsed / 2;
if (startSpeed < 0) delta = -delta;
offset = startOff + delta;
}
当我测试它时,它工作得非常好,因为卡图像在开始时会根据您的刷卡速度加快,然后随着您接近runDelta(端点)而减慢
还有一个函数调用updateAnimationAtTime,如下所示:
- (void)goToCard:(int)pos {
int max = 52;
startSpeed = sqrt(fabs(pos - startOff) * FRICTION * 2);
runDelta = fabs(startSpeed / FRICTION);
startTime = CACurrentMediaTime();
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doAnimation) userInfo:nil repeats:YES];
}
在上面的函数中,开始速度的计算与物理学中的计算类似:
Vf^2=Vo^2+2ug(Xf-Xi)
其中u是摩擦系数,他们假设重力等于1
所以代码是有效的,但是当卡片的数量从52张增加到300张时,动画看起来很有趣,因为它从开始到结束循环了300张卡片。我从来没有在代码中真正实现过与物理相关的东西,我想知道是否有人对如何更改代码有任何建议或提示,以使用户仍能感受到我们在所有卡片中循环的效果,但是当它超过50时,不能循环通过所有的卡片,因为这就是动画开始看起来有趣的地方,因为它开始旋转得如此之快,以至于循环通过卡片的原始效果消失了
如果我的问题需要澄清,请告诉我。谢谢只是预测你要走多远,保持25的开始和结束,省略中间的那些。问题是什么?只需预测你要走多远,把25个放在起点和终点,而忽略中间的那些。有什么问题吗?
- (void)goToCard:(int)pos {
int max = 52;
startSpeed = sqrt(fabs(pos - startOff) * FRICTION * 2);
runDelta = fabs(startSpeed / FRICTION);
startTime = CACurrentMediaTime();
timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(doAnimation) userInfo:nil repeats:YES];
}