CABasicAnimation和自定义类型
我对CoreAnimation不是很熟悉,所以我希望我错过了一些非常简单的事情。 我想通过[[view animator] setGradient:gradient];
以简单的方式为NSView的自定义属性( NSGradient ) [[view animator] setGradient:gradient];
。 我定义了+ (id)defaultAnimationForKey:(NSString *)key
并返回了一个简单的CABasicAnimation,但是,没有执行动画。 由于这适用于更简单的类型和NSColor,我猜CABasicAnimation不适用于渐变。 很好,但在这种特殊情况下,渐变是微不足道的(总是两次停止),所以我可以轻松地编写插值函数。 问题 :我如何定义自定义插值? 我搜索了关于视图,图层和动画的代表,动画类的子类等,但我无法弄清楚这些事情。 谢谢!
当我学习如何使用核心动画来演示如何设置无法由属性describedes处理的动画时,我想我记得通过了一些Apple文档。 一路上,我偶然发现了苹果的一些示例代码,这些代码描述如下:
显示单个渐变图层,并使用新的随机颜色连续动画。
这可能是您已经以另一种方式处理的具体任务的答案。 我在Xcode的文档和API参考中找到它,示例代码的名称只是渐变 。 (请注意,有一个原始版本1.0和更新版本1.1,今年4月重做,因此应该更容易与当前工具一起使用。
但是,创建Core Animation本身无法自动定制动画的更大问题是遵循Apple的Cocoa动画编程指南中的示例,即使用NSAnimation对象 。 它在主题Subclassing NSAnimation下进行了描述,推荐的方法显示在Smooth Animations标题下。 您重写setCurrentProgress:
方法,以便每次调用它时首先调用Super
以便NSAnimation更新进度值,即自定义动画属性,然后执行动画下一帧所需的任何更新或绘制。 以下是Apple在参考文档中提供的注释和示例代码:
如“设置和处理进度标记”中所述,您可以将一系列进度标记附加到NSAnimation对象,并让委托实施动画:didReachProgressMark:方法来重绘每个进度标记处的对象。 但是,这不是使对象动画的最佳方式。 除非您设置了大量进度标记(每秒30次或更多),否则动画可能会显得不平稳。
更好的方法是子类化NSAnimation并覆盖setCurrentProgress:方法,如清单4所示。NSAnimation对象在每帧之后调用此方法以更改进度值。 通过拦截此消息,您可以执行该框架所需的任何重绘或更新。 如果你重写这个方法,一定要调用super的实现,以便它可以更新当前的进度。
Listing 4 Overriding the setCurrentProgress: method
- (void)setCurrentProgress:(NSAnimationProgress)progress
{
// Call super to update the progress value.
[super setCurrentProgress:progress];
// Update the window position.
NSRect theWinFrame = [[NSApp mainWindow] frame];
NSRect theScreenFrame = [[NSScreen mainScreen] visibleFrame];
theWinFrame.origin.x = progress *
(theScreenFrame.size.width - theWinFrame.size.width);
[[NSApp mainWindow] setFrame:theWinFrame display:YES animate:YES];
}
因此,基本上你可以定义一个“进度值”(可能由多个值组成),它定义了你的自定义动画的状态,并编写代码给出当前“进度值”绘制或改变动画处于特定状态时绘制的内容。 然后,让NSAnimation使用设置动画的常规方法运行动画,它将执行您的代码以在适当的时间绘制动画的每个帧。
我希望那些你想知道的答案。 我怀疑我之所以能够通过搜索而没有看到它,因为我终于必须去我认为可能的地方,并且一页接一页地浏览整个主题以再次找到它!
链接地址: http://www.djcxy.com/p/12873.html