2

我需要能够在静态图像上显示动画。

鉴于 MPMoviePlayer 无法让您控制任何有用的东西,我能想到的唯一方法是使用多个静态图像,我们会(一个接一个地)显示这些图像来创建“类似电影”的动画。

我知道我们可以使用 UIImageView 来做到这一点(通过设置 UIImageView animationImages属性然后调用startAnimation),但是我们的动画中将有超过 100 个图像 - 所以内存使用量将被最大化。

有没有人有任何好的方法来做这种动画?使用核心动画还是 OpenGL?

我的猜测是我们需要创建一个图像缓冲区,当我们加载新图像时,我们会显示图像缓冲区中的图像?

4

4 回答 4

6

您可以使用 Core Animation CALayer 来托管您的动画,并在该主层内外交换一系列 CALayer 来执行逐帧动画。您可以使用其内容属性将图像帧托管 CALayer 的内容设置为 CGImageRef。可以根据需要创建一系列包含图像的 CALayer 并将其存储在 NSMutableArray 中,然后在完成后将其删除以最大程度地减少内存使用。

您可以通过在 CATransaction 中包装 replaceSublayer:with: 方法调用来设置帧之间的过渡持续时间,如下所示:

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0.25f] // 1/4th of a second per frame
                 forKey:kCATransactionAnimationDuration];   
[mainLayer replaceSublayer:[imageLayers objectAtIndex:oldImageIndex] with:[imageLayers objectAtIndex:newImageIndex]];
[CATransaction commit];

如果您的帧显示时间足够短,您可能还可以在主层的内容中换入和换出 CGImageRef。

于 2009-01-15T16:46:53.500 回答
1

正如您所发现的,使用 UIImageView.animationImages 不起作用,因为它会耗尽您的所有系统内存并且会使您的应用程序崩溃。您可以使用计时器并在每次计时器触发时设置 UIImageView 的图像属性,每次计时器触发时都需要加载用作内容的 UIImage 对象。这与另一个答案中描述的方法基本相同,只是它使用 CALayer 而不是 UIImageView。每次计时器触发时加载图像并更改图像内容是一种不错的方法,但它只能在 iPhone 上获得大约 11 FPS 的全屏图像。

如果您想使用实现 UIImageView 切换逻辑的工作示例,请下载此PNG 动画示例项目用于 xcode。我还提供了AVAnimator库,它是同类功能的优化版本,它支持 Quicktime Animation 和 APNG 格式以及压缩。

于 2011-05-20T20:44:07.200 回答
1

您可以使用CAKeyframeAnimation动画一系列图像/播放图像,如电影。

    //Get UIImage array
    NSMutableArray<UIImage *> *frames = [[NSMutableArray alloc] init];
    [frames addObject:[UIImage imageNamed:@"1"]];
    [frames addObject:[UIImage imageNamed:@"2"]];
    [frames addObject:[UIImage imageNamed:@"3"]];
    [frames addObject:[UIImage imageNamed:@"4"]];
    [frames addObject:[UIImage imageNamed:@"5"]];
    
    //Declare an array for animationSequenceArray
    NSMutableArray *animationSequenceArray = [[NSMutableArray alloc] init];
    
    //Prepare animation
    CAKeyframeAnimation *animationSequence = [CAKeyframeAnimation animationWithKeyPath: @"contents"];
    animationSequence.calculationMode = kCAAnimationDiscrete;
    animationSequence.autoreverses = YES;
    animationSequence.duration = 5.00; // Total Playing duration
    animationSequence.repeatCount = HUGE_VALF;
    
    for (UIImage *image in frames) {
        [animationSequenceArray addObject:(id)image.CGImage];
    }
    animationSequence.values = animationSequenceArray;
    
    //Prepare CALayer
    CALayer *layer = [CALayer layer];
    layer.frame = self.view.frame;
    layer.masksToBounds = YES;
    [layer addAnimation:animationSequence forKey:@"contents"];
    [self.view.layer addSublayer:layer]; // Add CALayer to your desired view
于 2021-08-10T13:08:17.747 回答
0

对于序列中的动画图像,

首先拍摄一组您需要播放的图像。

然后将此数组提供给动画并完成。

Iphone 中的井解释动画:一系列图像

于 2012-10-20T04:51:07.137 回答