- ベストアンサー
ローディング画面を設けてFLASH画像ギャラリーの改善方法
- FLASH8を使用してXMLを利用したスライドショーを制作しています。回線が遅い環境で画像の読み込みが遅くなり、表示されなくなる問題があります。そのため、最初の段階でローディング画面を設けて、ある程度読み込みが完了した時点で自動スライド開始とするか、全ての画像を読み込み終えてからスライドを開始する方法を検討しています。
- 画像は50枚前後の大きめの画像を使用しています。メモリ不足や回線スピード不足が原因と考えられます。改善策としては、予めローディング画面を表示して画像を読み込む時間を確保することや、全ての画像を事前に読み込んでからスライドを開始する方法が考えられます。
- XMLを使ったFLASH画像ギャラリーで、回線が遅い環境では画像の読み込みが遅れて表示されなくなる問題があります。解決策としては、ローディング画面を設けてある程度の読み込み完了後に自動スライドを開始する方法や、全ての画像を読み込んでからスライドを開始する方法が考えられます。画像は50枚程度の大きめの画像を使用しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
■次のフレームに移動しない件について 1.試しにgotoAndPlayをスクリプトの先頭に書く 関数の使い方自体があっているかどうかをチェックします 2.totalImages と loadedImages をtraceする ・totalImagesは totalImages = rootNode.childNodes.length; の後にトレースして画像数と一致しているかチェック ・loadedImagesは imageLoaderListener.onLoadInit と imageLoaderListener.onLoadError で1を加算した後にトレース FLASHのダウンロードシミュレート機能は画像を先読みしても キャッシュされないので、実際にブラウザで見るときと残念ながら異なります。 スクリプトのレイヤーを分けるとどうなるか試したことがないので分かりません。 同じレイヤーの先頭にstop()を入れたほうがいいかもしれません。自信無しです; あとなくても良いですが、最初のローディングがどこかで失敗することも考えられるので1フレーム目の最後に function loadComplete() { clearTimeout(LOADING_TIMEOUT); gotoAndPlay(2); } LOADING_TIMEOUT = setTimeout('loadComplete', 15000); のようなのを追加して、上記の例では15秒経過したら次のフレームへ強制移動させる。 ↑を追加した場合、 imageLoaderListener.onLoadInit と imageLoaderListener.onLoadError の if分の中のgotoAndPlay(2)をloadComplete()に変更すると良いと思います。 最後にアドバイスとして、 Flashのtraceは非常に便利な機能なので、 外部からデータを取って来たとき、関数を実行するとき、計算するとき等 どんどん乱用すると単純なミスを防げます。
その他の回答 (2)
- mr_araki
- ベストアンサー率85% (12/14)
中途半端な説明でもうしわけない…;; >gotoAndPlay('slideshow');のslideshowは これはスライドショーのあるフレームのラベルを指定します フレーム番号が2であれば gotoAndPlay(2); でも大丈夫です。 >//全画像数を取得。XMLの記述方法で変わってきます サンプルのXMlを見ると大丈夫そうです。 ようはtotalImagesの値が全画像の枚数と同じであればOK 今回はrootNode.childNodes.lengthからそれを取得しています > それと根本的なところなんですが > 1フレーム目に教えていただいたスクリプトを入れて > 2フレーム目にスライドショーのスクリプト > とすると、その渡し方はどうなりますでしょうか? > それぞれstopさせておいていいのでしょうか? 現状1フレームしかないような作りであれば 上記の方法でOKです 全画像が読み込まれるまで1フレーム目でずっとstopしていますので そこにローディングの画像などを配置します。 基本的に画像やらXMLを読み込む場合は 都度ムービーを止めてローディングするか 先に全部読み込んでからメインのムービーを開始します。 ※前者の方がサイトの利用者にとっては良いとは思いますが、作るのがとにかく大変です。
- mr_araki
- ベストアンサー率85% (12/14)
既存のソースを変更するのは結構めんどうだと思います。 画像を一度読み込んでおくとキャッシュされるので ひとつ前のフレームで先に読み込むのはどうでしょうか var totalImages:Number = 0;//全画像数 var loadedImages:Number = 0;//読み込み完了画像数 var imageLoader:MovieClipLoader = new MovieClipLoader(); var imageLoaderListener:Object = new Object(); imageLoaderListener.onLoadInit = function() { loadedImages += 1;//読み込み完了 if (loadedImages == totalImages) { //全画像読み込み完了。スライドショーへ gotoAndPlay('slideshow'); } } imageLoaderListener.onLoadError = function() { loadedImages += 1;//エラーの場合も完了とする if (loadedImages == totalImages) { //全画像読み込み完了。スライドショーへ gotoAndPlay('slideshow'); } } imageLoader.addListener(imageLoaderListener); //画像を読み込む為の適当なMCを作成 dummyMovieClip = _root.createEmptyMovieClip('dummy', 0); //非表示にする(他にもっとましなやり方はあると思いますが…) dummyMovieClip._x = -10000; //画像設定ファイル読み込み imageXmlLoader = new XML(); imageXmlLoader.ignoreWhite = true; imageXmlLoader.onLoad = pharseImageXml; ImageXmlLoader.load('photo.xml'); //画像設定ファイルパース関数 function pharseImageXml(Success:Boolean) { if(Success){ var rootNode = this.firstChild; //全画像数を取得。XMLの記述方法で変わってきます totalImages = rootNode.childNodes.length; for (node_index in rootNode.childNodes) { var currentNode = rootNode.childNodes[node_index]; var image = currentNode.attributes.image; //読み込み imageLoader.loadClip(image, dummyMovieClip); } } 先に全画像を読み込むのでローディングに結構時間がかかると思いますが 一番シンプルなやり方だと思います。
お礼
mr_araki 様 早速のアドバイスありがとうございました。 感謝します! せっかくアドバイスを頂いたのに 私の力不足で、そのスクリプトを上手く反映できずにいます。 申し訳ないです。 お手数ですが、私が理解していない部分について 教えていただけないでしょうか? とりあえず、私が書き換えなければいけないところは どこにあたるのでしょうか?勉強不足で申し訳ないです。 >gotoAndPlay('slideshow');のslideshowは 次のフレームのスクリプトの中を指すものと考えていいのでしょうか? それとも次のフレームに「slideshow」というラベルをつける 必要があるのでしょうか? >//全画像数を取得。XMLの記述方法で変わってきます とありましたが子ノードの表記の仕方で書き換えないといけない ということでしょうか? 読み込むXMLファイルは以下のような表記にしております。 -------------------------------------------------------- <?xml version="1.0" encoding="utf-8"?> <Photos> <picture image="sweden/01.jpg" p_width="525" p_height="350">#1</picture> <picture image="sweden/02.jpg" p_width="525" p_height="282">#2</picture> <picture image="sweden/03.jpg" p_width="525" p_height="318">#3</picture> <picture image="sweden/04.jpg" p_width="525" p_height="350">#4</picture> <picture image="sweden/05.jpg" p_width="525" p_height="217">#5</picture> ~省略~ <picture image="sweden/36.jpg" p_width="525" p_height="350">#36</picture> </Photos> -------------------------------------------------------- それと根本的なところなんですが 1フレーム目に教えていただいたスクリプトを入れて 2フレーム目にスライドショーのスクリプト とすると、その渡し方はどうなりますでしょうか? それぞれstopさせておいていいのでしょうか? よろしければ再度アドバイスをいただければと思います。 よろしくお願いいたします。
お礼
mr_araki 様 詳細な回答ありがとうございます。 教えていただいた通りにやってみて プレビューしてみましたが ローデングから次のフレームに移ってくれませんでした。 試しにxmlの画像リストを5枚でやってみましが フレーム2に進んでくれませんでした。 あと一歩な気がするのですが 申し訳ないです。 今回のスライドでなぜプリロードさせたいかというと ひとつに、macでスムーズに動くこと そしてADSL程度の回線を使用されている方でも 画像が飛ばずに見られること この2つの問題をクリアーするためです。 アルファの処理で、もう処理が追いついてない感じです 実際速い回線のWIN環境でみると 何の問題もないんですが…。 ローディングなしの段階で FLASH8のダウンロードシュミレートを行ってみると DSL(32.6kb/s)では、一枚目までは何とか表示できて 2枚目以降からは読み込みが追いつかず xmlのカウントだけが進んでいってしまいます。 (黒いまま、スライド番号とタイトルだけが一定時間ごとに表示されていく) 今の現状では1フレームの一番上のレイヤーにstopをいれて 下のレイヤーに教えていただいたスクリプトを そのままいれています。 何か足りないものがあったりするのでしょうか? 何度も答えていただいて本当にありがとうございます 本当に感謝しております。