0

iOS アプリでムービー アニメーションを使用するために、AVAnimator ライブラリを使用しています。アニメーションは正常に動作していますが、アニメーションが終了したら削除できる必要があり、前のアニメーションが完了する前でも同じアニメーションを上に再生できるようにする必要があります。

アニメーション化に使用しているコードは次のとおりです。

    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];
}
4

1 に答える 1

0

アニメーション ループが完了したことを示す通知を受け取ったら、[bassView attachMedia:nil] を使用してウィンドウ/ビューからメディア オブジェクトを切断する必要があります。stopAnimator を呼び出すだけで、ビューへの新しいフレームの送信が停止しますが、アニメーション サイクルが実際に完了した場合は、ビューからメディアを切断すると、リソースの割り当てが解除され、メモリが解放されます。また、animatorFrameDuration は、.mvid ファイルの読み取り時にデフォルトで定義されるため、設定する必要はありません。再生フレームレートを変更したい場合は明示的に設定できますが、デスクトップでムービーを作成するときに「mvidmoviemaker Frame1.png Movie.mvid -fps 10」を介してムービーの FPS をエンコードするだけです。

画面上の複数のインスタンスで同じアニメーションを一度に再生したい場合は、2 つの異なるメディア オブジェクトを作成し、適切なタイミングで開始および停止する必要があります。これらのメディア オブジェクトを画面上のさまざまなビュー オブジェクトにアタッチする必要がありますが、それだけで十分です。1 つのメディア オブジェクトを使用してこれをコーディングし、それがロードされるのを待ってから、最初のメディア オブジェクトの準備ができたら、同じローダーを 2 番目のメディア オブジェクトに割り当てて、tmp ディレクトリ内の既に解凍された同じファイルから読み取ることができます。同じ入力ファイルに対して 2 つの異なるローダーを作成する一般的な方法を使用することもできますが、アプリの起動時に 2 つの異なるローダーの両方が同じファイルをロードすると、スレッドの競合状態が発生することに注意してください。競合状態を回避するためのローダー オブジェクト。

于 2013-09-30T20:15:05.247 に答える