我正在使用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];
}
答案 0 :(得分:0)
当您收到通知以指示动画循环已完成时,您应使用[bassView attachMedia:nil]断开媒体对象与窗口/视图的连接。只是调用stopAnimator将停止向视图发送新帧,但如果动画循环确实已完成,则断开媒体与视图的连接将释放资源并释放内存。此外,您不需要设置animatorFrameDuration,因为在读取.mvid文件时默认定义它。如果要更改播放帧速率,可以明确设置它,但在桌面上创建电影时,可以通过“mvidmoviemaker Frame1.png Movie.mvid -fps 10”对电影中的FPS进行编码。
如果要同时在屏幕上播放具有多个实例的相同动画,则需要创建2个不同的媒体对象,然后在适当的时间启动和停止它们。您需要将这些媒体对象附加到屏幕上的不同视图对象,但这就是它的全部内容。您可能使用1个媒体对象对其进行编码,等待它加载,然后在第一个媒体对象准备就绪后,您可以将相同的加载器分配给第二个媒体对象,并从tmp目录中的同一个已解压缩的文件中读取。您还可以使用常用方法为同一输入文件创建2个不同的加载器,但是如果两个不同的加载器都在应用启动时加载相同的文件,请注意存在线程争用情况,您还可以在您的设置上设置serialLoading标志。装载机对象以避免竞争条件。