使用核心动画实现高斯模糊的动画效果?

10

我正在尝试制作一个动画,一开始它是模糊的,然后逐渐变得清晰。我想这个动画还不错,但当动画完成时,它仍然有点模糊。我是错了吗?

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上实现这个的人,仅供参考...很遗憾目前还不支持。希望将来可以获得这个功能。 - user3344977
2个回答

9
您的问题是动画停止并自动删除,但过滤器仍然存在微小的模糊效果。
您需要在动画完成后移除模糊过滤器。需要向CABasicAnimation实例添加代理并实现-[id animationDidStop:finished:]方法。
如果让self成为代理,则应该相当简单,在将动画添加到图层之前添加此行:
blurAnimation.delegate = self;

回调函数同样简单:

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

2
如果你正在寻找一种优化的方式来实现模糊动画,我建议先创建一个视图的单个模糊图像,然后在原始视图上方将模糊图像从alpha 0渐变到1。测试结果看起来非常流畅快速。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接