・・・AS3でアニメGIFの再生を試していたと思ったら、いつの間にかイベント発生周辺の処理順序に悩まされていた。・・・

  • このエントリーをはてなブックマークに追加
  • 80

現在、Progression Frameworkの実験として、「Flickrから最新写真一覧のRSSを読み込んで、アルバムっぽく表示する」というのを作ってみとるんですわ。でまぁ、RSSやら画像のロード中に表示する、「NOW LOADING」的な表示を行うために、これまでのエントリで紹介してきた、

などと色々やってたんだが、コマンドベースでアニメーションすると、その間他の動作が出来ないことに気づいたので、結論としては、
やっぱ「NOW LOADING」的なアニメGIFを表示するのがいいよね
と言うことになった。
でもAS3だけだと、アニメGIFは1フレームしか表示されない。そこで、GIFPlayerなるライブラリを使用してみた。
でも、コイツはバグっぽい所があったのでちょっと直さないと動かない。
あと、GIFPlayerはライセンスが

License: GNU General Public License v3
as3gif – Google Code

と書いてある。え?、GPLv3かよ?。
GPLは堅苦しいしややこしいし、正直敬遠したいライセンスではある。
しかも、ByteArray.orgの方に書いてある紹介記事には、

Creative Commonsですよと書いてある。ワケがわからん。
このサンプルコードはCCで、本体はGPLv3なのか?

まぁいいや。
とりあえず今回はGIFPlayerの使い方と、バグ?修正の方法。
まず使い方。

ActionScript

  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.net.URLRequest;
  5.     import org.gif.events.GIFPlayerEvent;
  6.     import org.gif.player.GIFPlayer;
  7.    
  8.     public class Main extends Sprite
  9.     {
  10.         private var gif:GIFPlayer;
  11.  
  12.         public function Main():void
  13.         {
  14.             gif = new GIFPlayer(false);
  15.             gif.addEventListener(GIFPlayerEvent.COMPLETE, onComplete);
  16.             gif.load(new URLRequest("loading.gif"));
  17.             addChild(gif);
  18.         }
  19.        
  20.         private function onComplete(e:GIFPlayerEvent):void
  21.         {
  22.             gif.play();
  23.             gif.stop();
  24.             gif.play();
  25.         }
  26.     }
  27. }

コンストラクタにある3行で、インスタンスを初期化し、完了時のイベントを設定し、GIF画像を読み込んでいる。
で、完了したら再生→停止→再生。
まぁ、完了時の3つの動作は、動作テストのためのコードなので気にしないで。
ともかく、再生したい時→play()、停止したい時→stop()でOK。
コンストラクタに引数を与えないか、trueを与えると、読み込んだ瞬間に再生が開始される。

が、そうは問屋が卸さないのが俺のActionScript道。

犬も歩けば棒にあたると言うことで、例によって思い通り動かないと言う問題発生。
コンストラクタにfalseを渡すと、なぜかplay()を実行してもアニメーションが再生されない。
おお、ホワーイ?
・・・
原因は、自動再生するかどうかのコードを実行する前に、イベントをぶん投げてるから。
GIF画像を読み込み後、コンストラクタの引数に応じて再生するかどうかを決める部分のコード

ActionScript

  1. dispatchEvent ( new GIFPlayerEvent ( GIFPlayerEvent.COMPLETE , Frames[0].bitmapData.rect ) );
  2.  
  3. arrayLng = aFrames.length;
  4.  
  5. auto ? play() : gotoAndStop (1);

これね。この順番だと、呼び出し順序的にこうなる。

  1. dispatchEvent (new GIFPlayerEvent (GIFPlayerEvent.COMPLETE , aFrames[0].bitmapData.rect));(GIFPlayer#onComplete)
  2. gif.play();(Main#onComplete)
  3. gif.stop();(Main#onComplete)
  4. gif.play();(Main#onComplete)
  5. auto ? play() : gotoAndStop (1);(GIFPlayer#onComplete)
  6. if ( myTimer.running ) myTimer.stop();(GIFPlayer#gotoAndStop)

最後にgotoAndStopが呼び出され、停止で終わってしまいました。残念。

と言う事で、直さないと駄目。

ActionScript

  1. arrayLng = aFrames.length;
  2.  
  3. auto ? play() : gotoAndStop (1);
  4.  
  5. dispatchEvent ( new GIFPlayerEvent ( GIFPlayerEvent.COMPLETE , aFrames[0].bitmapData.rect ) );

これで良し。修正前後のサンプルはこちら
が、GPLv3なので、修正版の全コードを公開しないと駄目とか、そういう制約があるんかな?
一応、修正したコードをアップロードして、リンクしときます。

しかし、こういう場合の本来の手続きってどうすればいいんだ?
Google Codeのプロジェクトにjoinさせてもらい、修正とか?
それともコメントすべきか?
いや、そもそもこの問題って、俺の環境でしか出ないとか?

スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク