我必须为离线计算的元素的alpha设置动画。让我们谈谈简单的alpha动画。 Alpha为零,alpha增长为1,保持一段时间并返回零。
如下图所示:
动画会有不同的时间。我需要能给出时间(t)并获得价值(v)的东西。
此动画将放在基于CIFilter
的类中并用于为该过滤器设置动画,因为此过滤器的结果将在离线状态下计算,因此没有CALayer
来添加它,因此使用CAKeyframeAnimation
或CABasicAnimation
是不可能的。
如果我可以使用CALayer,我会这样做:
CABasicAnimation* fadeInOut = [CABasicAnimation animation];
fadeInOut.keyPath = @"filters.myFilter.inputRadius";
fadeInOut.fromValue = @(0);
fadeInOut.toValue = @(10);
fadeInOut.duration = 0.2f;
fadeInOut.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
fadeInOut.autoreverses = YES;
但问题是这一行...没有添加动画的图层。就像我说我在CIFilter
班级里面一样!
[self.layer addAnimation:fadeInOut forKey:nil]; // NO WAY!
所以,我的问题是:在为动画定义的时间间隔内,是否有某些东西可以为我提供这种曲线的时间价值?
答案 0 :(得分:1)
你是CIFilter
的子类并动画...我认为这意味着你的过滤器类需要一个时间参数,并根据它改变它的结果?
如果是这样,您可以查看两个选项。两者都依赖于这样一个事实,即你想要的时间曲线看起来像是一个“易于缓解”的S曲线,然后曲线反过来。
如果您正在编写CI内核语言代码来实现过滤器的效果,则可以使用the smoothstep
function基于时间参数进行插值(该函数由GLSL定义,CI内核语言是超集GLSL除了defined otherwise以外。由于你有一个双S曲线,你需要做两次:
// pseudo CI Kernel source:
effect = smoothstep(0, 0.5, time) - smoothstep(0.5, 1, time)
如果您没有编写内核,而是根据其他过滤器实现过滤器,则可以定义自己的smoothstep函数等效项 - 该定义为well known并且相当简单,因为它存在于许多图形库中。 (或者您可以了解Hermite interpolation一般情况,并使用自己的平滑函数进行操作。)然后使用您的函数根据时间参数更改内部过滤器的输入。