顺利更新运行animation
我有一些图片,我运行连续的animation。 如何平滑地更新这些正在运行的animation,以便它们之间没有可见的转换,除非部分animation。
例如旋转和缩放图像,然后更新animation以旋转原样,但略微放大。 我目前有一个明显的变化。
我可以想象,缩放应该在一个animation块中完成,并且像以前一样运行旋转animation,问题就出现在旋转会在缩放时停止。
我需要它是无缝的。 例如,这个代码块不会导致平滑的缩放,即使它使用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; }];
说实话,如果你的视图上有连续的animation,会改变运行时的状态,那么UIViewanimation不是最好的办法,而且可能会导致抖动,而完成处理程序一遍又一遍地被调用。
然而,你想在块中做2个animation,你可以在同一个块中设置比例和旋转,他们会同时发生。 或者你可以调用一个启动块的函数,并在完成时再次调用它来查看该视图是否有新的animation。 如果没有,完成块只是停止,recursion地使用它们,尽pipe这不是我不推荐的方法,如果你在大量的视图上继续做很多的animation的话。
在OpenGLES中,您使用NSTimer运行连续animation,以处理应用中所有animation的更新。 如果你走这条路,那就更加努力了,你需要实现缓动/二次曲线函数来平滑animation。 然而,如果扩展clases,你可以为每个图像设置状态,然后当计时器触发时,可以根据你给定的状态更新它的转换。 所以当它旋转了一定的度数/弧度时,你可以设置它的比例。 现在要保持animation顺畅,您将需要使用NSTimerIntervals来确保您乘以时间stream逝的距离,以获得stream畅的animation。 就个人而言,这是我用于可能在屏幕上不断移动的事物的路线,但如果您只需要移动事物两次然后完成,就可能会过度杀死。
编辑:代码做你问第二步!
所以你需要声明一个NSTimer来轮询你的animation步骤和一个NSTimeInterval,以便每一步只更新你的animation。
NSTimer *animationTimer; NSTimeInterval animationInterval; NSTimeInterval lastUpdateTime; float currentRotation; float current scale;
第三,你需要设置一个NSTimer来启动视图的更新:
- (void)startAnimation { animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView:) userInfo:nil repeats:YES]; } - (void)stopAnimation { [animationTimer invalidate]; animationTimer = nil; }
那么当你的观点开始或者你想开始像这样的工作时,你需要把这个东西踢掉
- (void)setAnimationInterval:(NSTimeInterval)interval { animationInterval = interval; if(animationTimer) { [self stopAnimation]; [self startAnimation]; } }
然后在您的drawView:方法中,您需要根据定时器的每次触发之间的时间间隔来更新转换,以便随着时间的推移animation是平滑的和恒定的。 本质上是一个线性变换在这一点上。
- (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]; }
请注意,这不会为您的animation添加缓动,也不会在物理上停止,因此您将需要使用该animation。 此外,您可能需要确保旋转超过360时,将其重置为0,并分别在度数和弧度之间进行转换。
考虑使用物理学的东西,如反弹和摩擦,使事情缓慢很好。
查看二次图,以便使事情平稳过渡,基本上是二次插值。