【问题标题】:Animating a gaussian blur using core animation?使用核心动画制作高斯模糊动画?
【发布时间】:2011-10-08 13:41:08
【问题描述】:

我正在尝试为最初模糊的东西制作动画,然后它会成为焦点。我想它工作正常,但是当动画完成时它仍然有点模糊。我做错了吗?

CABasicAnimation* blurAnimation = [CABasicAnimation animation];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[blurFilter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputRadius"];
[blurFilter setName:@"blur"];
[[self layer] setFilters:[NSArray arrayWithObject:blurFilter]];

blurAnimation.keyPath = @"filters.blur.inputRadius";
blurAnimation.fromValue = [NSNumber numberWithFloat:10.0f];
blurAnimation.toValue = [NSNumber numberWithFloat:1.0];
blurAnimation.duration = 1.2;

[self.layer addAnimation:blurAnimation forKey:@"blurAnimation"];

【问题讨论】:

  • 仅供任何希望在 iOS 上执行此操作的人参考……不幸的是,它尚不支持。希望我们将来能获得此功能。

标签: objective-c cocoa macos core-animation


【解决方案1】:

您的问题是动画停止并被自动删除,但过滤器在应用最微小的模糊时仍然存在。

您要做的是在动画完成时移除模糊滤镜。您需要向CABasicAnimation 实例添加一个委托并实现-[id<CAAnimationDelegate> animationDidStop:finished:] 方法。

如果在这种情况下让self 成为代理,它应该相当简单,在将动画添加到图层之前添加此行:

blurAnimation.delegate = self;

而且回调同样简单:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    [[self layer] setFilters:nil];
}

【讨论】:

    【解决方案2】:

    如果您正在寻找优化模糊动画的方法,那么我建议您创建一个视图的单个模糊图像,然后在原始视图的顶部将模糊图像从 alpha 0 淡化到 1。在测试中看起来又好又快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      相关资源
      最近更新 更多