我正在尝试使用 CAAnimation.CurrentMediaTime 更改显式 iOS 动画的速度(想想 CABasicAnimation 或 CAKeyFrameAnimation)。这种方法比停止动画,然后以新的持续时间重新启动要好得多。我很接近完成这一切,但我遇到了一个小问题。我有时可以开始、暂停、恢复和更改速度,但更改速度功能有问题。任何人都可以阐明情况吗?我有一些非常简单的代码和下面的示例项目。
类级变量
UIView MyImage;
double timeSincePause = 0;
double pauseTime = 0;
我的暂停功能(有效)
MyImage.Layer.Speed = 0.0f;
MyImage.Layer.TimeOffset = MyImage.Layer.ConvertTimeFromLayer(CAAnimation.CurrentMediaTime(), MyImage.Layer) - timeSincePause;
我的停止功能(有效)
pauseTime = MyImage.Layer.TimeOffset;
MyImage.Layer.Speed = 1.0f;
MyImage.Layer.TimeOffset = 0.0f;
MyImage.Layer.BeginTime = 0.0f;
timeSincePause = (MyImage.Layer.ConvertTimeFromLayer(CAAnimation.CurrentMediaTime(), MyImage.Layer) - pauseTime);
MyImage.Layer.BeginTime = timeSincePause;
我的更改速度功能(不起作用) 要重现问题,只需启动项目并点击更改速度按钮几次。请注意,当它从 100% 速度变为 30% 速度时,它会正确地改变速度,但是当它从 30% 速度变为 100% 速度时,对象的位置会向前跳跃,就好像速度从未改变到 30% 一样。这显然是我正在保存的时间值的问题,我已经尝试过但无法让它工作。
MyImage.Layer.TimeOffset = MyImage.Layer.ConvertTimeFromLayer(CAAnimation.CurrentMediaTime(), MyImage.Layer);
MyImage.Layer.BeginTime = CAAnimation.CurrentMediaTime();
// I have it set so the speed changes back and forth between 100% and 30%.
if ( MyImage.Layer.Speed == 1.0f )
MyImage.Layer.Speed = 0.3f;
else
MyImage.Layer.Speed = 1.0f;
这是使用 Xamarin Studio iOS在C# 中编写的非常简单的示例项目的链接: https ://www.dropbox.com/s/ndfo12rbemsnp1s/ChangeAnimationSpeed.zip
- - - - - 附加信息 - - - - -
我已经确定问题是我没有考虑由于速度变化而失去/获得的时间......我只是不确定如何考虑到这一点......所以我基本上需要添加另一个名为“totalTimeLostResultingFromSpeedChange”的类级别变量并跟踪它并以某种方式将其考虑在内......