gpt4 book ai didi

ios - 平滑更新运行动画

转载 作者:行者123 更新时间:2023-11-29 10:59:11 25 4
gpt4 key购买 nike

我有很多图像在上面运行连续动画。如何平滑地更新这些正在运行的动画,以便它们之间没有可见的过渡,除非是动画的一部分。

例如旋转和缩放图像,然后更新动画以按原样旋转,但略微放大。我目前有明显的变化。

我可以想象缩放应该在动画 block 中完成,他们只是像以前一样运行旋转动画,问题是旋转会在放大时停止。

我需要它是无缝的。例如此代码块不会导致平滑缩放,即使它使用 UIViewAnimationOptionBeginFromCurrentState

[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseOut //| UIViewAnimationOptionRepeat
animations:(void (^)(void)) ^{
imageViewToScale.transform = CGAffineTransformMakeScale(1.2, 1.2);
}
completion:^(BOOL finished){
//imageViewToScale.transform=CGAffineTransformIdentity;
}];

最佳答案

老实说,如果你要在你的 View 上有连续的动画,这将在运行时改变那里的状态,UIView 动画不是他最好的方法,并且可能会在完成处理程序被一遍又一遍等调用时导致抖动。

但是如果您想在 block 中做 2 个动画,您可以在同一个 block 中设置比例和旋转,它们将同时发生。或者您可以调用一个启动 block 的函数,并在完成时再次调用它以查看该 View 是否有任何新动画。当没有时,完成 block 就会停止,递归地使用它们,但如果你连续在很多 View 上做很多动画,这不是我不推荐的方法。

在 OpenGLES 中,您使用 NSTimer 运行连续动画,该动画将处理应用中所有动画的更新。如果你走这条路,它会付出更多的努力,你需要自己实现缓动/二次曲线函数来实现平滑的动画。但是,如果您扩展类,则可以为每个图像设置状态,然后当计时器触发时,您可以根据给定的状态更新其转换。因此,当它旋转了一定的度数/弧度时,您可以将其设置为缩放。现在要保持动画流畅,您需要使用 NSTimerIntervals 来确保将移动的距离乘以耗时以获得流畅的动画。就我个人而言,这是我用于可能会不断在屏幕上移动但如果您只需要移动两次然后就可以完成的东西的路线。

编辑:按照您的要求执行第二步的代码!

所以你需要声明一个 NSTimer 来轮询你的动画步骤和一个 NSTimeInterval 以便你只根据已经过去的时间量更新你的动画每个步骤。

NSTimer *animationTimer;
NSTimeInterval animationInterval;
NSTimeInterval lastUpdateTime;
float currentRotation;
float current scale;

第三,您需要设置一个 NSTimer 来触发 View 的更新:

- (void)startAnimation
{
animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView:) userInfo:nil repeats:YES];
}

- (void)stopAnimation
{
[animationTimer invalidate];
animationTimer = nil;
}

然后你需要在你的 View 开始时或者当你想开始动画的时候把它踢掉,这样的事情是可行的

- (void)setAnimationInterval:(NSTimeInterval)interval
{
animationInterval = interval;

if(animationTimer)
{
[self stopAnimation];
[self startAnimation];
}
}

然后在您的 drawView: 方法中,您需要根据每次触发计时器之间耗时来更新您的转换,以便动画随着时间的推移变得流畅且恒定。在这一点上本质上是一个线性变换。

- (void)drawView:(id)sender
{
if(lastUpdateTime == -1)
{
lastUpdateTime = [NSDate timeIntervalSinceReferenceDate];
}

NSTimeInterval timeSinceLastUpdate = [NSDate timeIntervalSinceReferenceDate] - lastUpdateTime;

currentRotation = someArbitrarySCALEValue * timeSinceLastUpdate;
currentScale = someArbitraryROTATIONValue * timeSinceLastUpdate;

CGAffineTransform scaleTrans = CGAffineTransformMakeScale(currentScale,currentScale);
CGAffineTransform rotateTrans = CGAffineTransformMakeRotation(currentRotation * M_PI / 180);

imageViewToScale.transform = CGAffineTransformConcat(scaleTrans, rotateTrans);


lastUpdateTime = [NSDate timeIntervalSinceReferenceDate];
}

请注意,这不会为您的动画添加缓动,也不会在物理上停止您需要使用它。此外,您可能需要确保当旋转超过 360 度时将其重置为 0,并分别在度数和弧度之间进行转换。

研究使用物理学来处理反弹和摩擦等问题,让事情变慢。

研究二次曲线图,以便使事情随着时间的推移平稳移动,本质上是二次插值。

关于ios - 平滑更新运行动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com