gpt4 book ai didi

core-animation - 使用 Core Animation 减慢和加速动画

转载 作者:行者123 更新时间:2023-12-04 08:28:28 34 4
gpt4 key购买 nike

我正在尝试对我的应用程序应用慢动作效果,就像按 Shift 时如何减慢 Mac OS 的大多数图形效果一样。

我的应用程序使用 CoreAnimation,所以我认为它应该没什么大不了的:set speed到一些较慢的值(如 0.1 )并将其设置回 1一旦我完成了,我就走了。

不幸的是,这似乎不是正确的方法。减速效果很好,但是当我想恢复正常速度时,它会恢复,好像速度是 1整个时间。这基本上意味着,如果我按住 Shift 的时间足够长,只要我松开它,动画就会立即完成。

我找到了一个技术 QA 页面,解释了如何暂停和恢复动画,但如果不是完全暂停动画,我似乎无法正确理解。我绝对不擅长时间扭曲。

用 CoreAnimation 减慢然后恢复动画的正确方法是什么?

这是有用的代码:

-(void)flagsChanged:(NSEvent *)theEvent
{
CALayer* layer = self.layer;
[CATransaction begin];
CATransaction.disableActions = YES;
layer.speed = (theEvent.modifierFlags & NSShiftKeyMask) ? 0.1 : 1;
[CATransaction commit];
}

最佳答案

棘手的问题...

我用一个基本的 UIView 设置了一个测试。
我从当前点到目标点启动其图层的动画。

为了减慢核心动画,我实际上不得不构造和替换一个新的动画(因为你不能修改现有的动画)。

弄清楚当前动画已经进行了多远,这一点尤其重要。这是通过访问 beginTime、currentTime、计算耗时然后确定新动画的持续时间应该多长来完成的。

- (void)initiate {
if(!initiated) {
[CATransaction begin];
[CATransaction disableActions];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];
CABasicAnimation *ba = [CABasicAnimation animationWithKeyPath:@"position"];
ba.duration = 10.0f;
ba.fromValue = [NSValue valueWithCGPoint:view.layer.position];
ba.toValue = [NSValue valueWithCGPoint:CGPointMake(384, 512)];
[view.layer addAnimation:ba forKey:@"animatePosition"];
[CATransaction commit];
initiated = YES;
}
}

- (void)slow {
[CATransaction begin];
CABasicAnimation *old = (CABasicAnimation *)[view.layer animationForKey:@"animatePosition"];
CABasicAnimation *ba = [CABasicAnimation animationWithKeyPath:@"position"];
CFTimeInterval animationBegin = old.beginTime;
CFTimeInterval currentTime = CACurrentMediaTime();
CFTimeInterval elapsed = currentTime - animationBegin;
ba.duration = [[old valueForKey:@"duration"] floatValue] - elapsed;
ba.duration = [[old valueForKey:@"duration"] floatValue];
ba.autoreverses = [[old valueForKey:@"autoreverses"] boolValue];
ba.repeatCount = [[old valueForKey:@"repeatCount"] floatValue];
ba.fromValue = [NSValue valueWithCGPoint:((CALayer *)[view.layer presentationLayer]).position];
ba.toValue = [old valueForKey:@"toValue"];
ba.speed = 0.1;
[view.layer addAnimation:ba forKey:@"animatePosition"];
[CATransaction commit];
}

- (void)normal {
[CATransaction begin];
CABasicAnimation *old = (CABasicAnimation *)[view.layer animationForKey:@"animatePosition"];
CABasicAnimation *ba = [CABasicAnimation animationWithKeyPath:@"position"];
CFTimeInterval animationBegin = old.beginTime;
CFTimeInterval currentTime = CACurrentMediaTime();
CFTimeInterval elapsed = currentTime - animationBegin;
ba.duration = [[old valueForKey:@"duration"] floatValue] - elapsed;
ba.autoreverses = [[old valueForKey:@"autoreverses"] boolValue];
ba.repeatCount = [[old valueForKey:@"repeatCount"] floatValue];
ba.fromValue = [NSValue valueWithCGPoint:((CALayer *)[view.layer presentationLayer]).position];
ba.toValue = [old valueForKey:@"toValue"];
ba.speed = 1;
[view.layer addAnimation:ba forKey:@"animatePosition"];
[CATransaction commit];
}

注意:以上代码仅适用于 1 个方向,不适用于自动反转的动画...

关于core-animation - 使用 Core Animation 减慢和加速动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9269568/

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