所以我正在看一些代码,基本上有一排图像,你在行上滑动,卡片图像根据滑动在行中移动。就像你给它一个轻弹,然后它在列表中移动5张牌。你给它一个小电影,然后你在列表中移动1张卡。它还能够输入一个卡号,就像你从卡1开始,并想要去卡52,你输入52,它滚动所有51卡到达卡52并停止。滑动手势和goToCard代码都调用以下方法:
- (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;
}
看起来开发人员试图匹配
的物理速度方程DeltaX = Vot + (1/2) accel * time^2
当我测试它时卡片图像根据您在开始时的滑动加速,然后随着接近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];
}
看起来在上面的函数中,startSpeed的计算方式与物理学中的相同:
Vf ^ 2 = Vo ^ 2 + 2ug(Xf - Xi) 其中u是摩擦的系数,它们假设重力等于1.
因此代码可以工作,但是当卡片数量从52增加到300时,动画看起来很有趣,因为它从头到尾循环通过300张卡片。我从来没有真正在代码中实现与物理相关的东西,并且想知道是否有人有任何关于如何更改代码的建议或提示仍然给用户带来我们在所有卡片中循环的效果,但不会循环通过所有当它超过50时,动画开始变得有趣,因为它开始旋转得如此之快,以至于失去了通过卡片循环的原始效果。
如果我的问题需要澄清,请告诉我。谢谢!