【问题标题】:Core Animation animating an array of images核心动画动画一组图像
【发布时间】:2011-08-11 18:55:05
【问题描述】:

我基本上想要做的是 tp 以快速(60/秒)显示一系列图像以创建序列。我要创建一个计时器,看看它是否足够快。

我想使用动画在我的可可应用中显示一组图像(每秒最多 60 个)。

这是我目前制作的动画:

- (CAAnimation*)imageAnimation;
{
    CGImageRef image1 = [self nsImageToCGImageRef:[NSImage imageNamed:@"1.png"]];
    CGImageRef image2 = [self nsImageToCGImageRef:[NSImage imageNamed:@"2.png"]];
    CGImageRef image3 = [self nsImageToCGImageRef:[NSImage imageNamed:@"3.png"]];

    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

    NSArray *images = [NSArray arrayWithObjects:(id)image1, (id)image2, (id)image3, nil];

    [animation setValues:images];
    [animation setDuration:3.0];

    return animation;
}

nsImageToCGImageRef 是我在别处定义的方法。现在,我不确定从这里到哪里才能将此动画添加到我的视图中。

【问题讨论】:

  • 为什么投反对票?问题还不够清楚吗?

标签: objective-c cocoa core-animation


【解决方案1】:

您应该调查CVDisplayLink,它允许您在每次 Mac 的显示子系统即将显示帧时接收回调。这将使您能够以 60fps 的速度显示图像而不会丢帧,因为 API 仅在需要更新时才调用您的代码。

这意味着您无需担心将计时器与显示器同步,也意味着您不会做不必要的工作。如果您的绘图代码很慢,您还可以执行一些操作,例如仅在备用回调上更新以将帧速率降低到 30fps。

【讨论】:

    【解决方案2】:

    首先,问题还不够清楚。您可能需要重新措辞,因为问题没有清楚地说明您想要实现的目标,也没有说明您到目前为止使用代码所做的任何事情。

    CAKeyframeAnimation 用于在动画期间指定图层属性的值。

    您正在使用属性位置创建关键帧动画;在这种情况下,您应该给出动画期间要设置的图层的位置值。您正在尝试更改图像。根据我从您的代码中可以理解的内容,您应该使用图像值设置内容属性而不是动画属性,但您不会获得流畅的动画。我自己没有尝试过,但基于理论,这是需要的。你的代码能正常工作吗?即使速度很慢,我也不认为是您要求的方式?请让我知道将消息 animationWithKeyPath 的属性名称“位置”更改为“内容”是否有效,即使它很慢?

    您需要为此准备一个带纹理的图集。看看网址http://mysterycoconut.com/blog/2011/01/cag1/

    根据我从您的问题中可以理解的内容,这可能会显示您的需求。

    【讨论】:

    • 对不起,如果问题不够清楚。基本上我有许多图像的序列,每个关键帧都有一个(所以每秒 60 个图像)。我想要的是按顺序显示这些图像,从而创建动画
    【解决方案3】:

    经过一些研究和试验,似乎最好的方法是改用计时器,并用下一个可用的图像更改图像。

    【讨论】:

    • 我建议您尝试使用CVDisplayLink,它是专门为此类任务而构建的。看我的回答。
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多