用于 iOS 上的电影动画的 AVAnimator
Posted
技术标签:
【中文标题】用于 iOS 上的电影动画的 AVAnimator【英文标题】:AVAnimator for movie animations on iOS 【发布时间】:2013-09-10 23:15:13 【问题描述】:我正在使用 AVAnimator 库以便在我的 ios 应用程序中使用电影动画。我的动画效果很好,但我需要能够在动画结束后移除它,并且即使在前一个动画完成之前也允许相同的动画在其自身之上播放。
这是我用来制作动画的代码:
bassView = [AVAnimatorView aVAnimatorViewWithFrame:CGRectMake(322,460,375,224)];
AVAnimatorMedia *media = [AVAnimatorMedia aVAnimatorMedia];
AV7zAppResourceLoader *resLoader = [AV7zAppResourceLoader aV7zAppResourceLoader];
resLoader.archiveFilename = @"Archive.7z";
resLoader.movieFilename = @"bass_iPad.mvid";
resLoader.outPath = [AVFileUtil getTmpDirPath:@"bass_iPad.mvid"];
media.resourceLoader = resLoader;
AVMvidFrameDecoder *frameDecoder = [AVMvidFrameDecoder aVMvidFrameDecoder];
media.frameDecoder = frameDecoder;
media.animatorFrameDuration = AVAnimator10FPS; // this is a constant I made for the frame rate
[media prepareToAnimate];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(animatorDoneNotification:)
name:AVAnimatorDoneNotification
object:media];
[mainView addSubview:bassView];
[bassView attachMedia:media];
[media startAnimator];
- (void)animatorDoneNotification:(NSNotification*)notification
NSLog(@"animation done");
AVAnimatorMedia *media = notification.object;
[media stopAnimator];
[bassView removeFromSuperview];
【问题讨论】:
【参考方案1】:当您收到指示动画循环完成的通知时,您应该使用 [bassView attachMedia:nil] 断开媒体对象与窗口/视图的连接。只需调用 stopAnimator 将停止向视图发送新帧,但如果动画循环真的完成,那么断开媒体与视图的连接将释放资源并释放内存。此外,您不需要设置 animatorFrameDuration,因为它是在读取 .mvid 文件时默认定义的。如果您想更改播放帧率,您可以明确设置它,但您可以在桌面上创建电影时通过“mvidmoviemaker Frame1.png Movie.mvid -fps 10”对电影中的FPS进行编码。
如果您想一次在屏幕上播放具有多个实例的相同动画,您需要创建 2 个不同的媒体对象,然后在适当的时间启动和停止它们。您将需要将这些媒体对象附加到屏幕上的不同视图对象,但仅此而已。您可能会使用 1 个媒体对象对其进行编码,等待它加载,然后一旦第一个媒体对象准备好,您可以将相同的加载程序分配给第二个媒体对象,并从 tmp 目录中相同的已解压缩文件中读取它。您还可以使用通用方法为同一个输入文件创建 2 个不同的加载程序,但请注意,如果两个不同的加载程序在应用程序启动时都加载同一个文件,则存在线程竞争条件,您还可以在您的loader 对象以避免竞争条件。
【讨论】:
以上是关于用于 iOS 上的电影动画的 AVAnimator的主要内容,如果未能解决你的问题,请参考以下文章