環境:FLASH8
XMLを利用したFLASH画像ギャラリー(スライドショー)を
制作しています。
スクリプトはあるFLASHの勉強サイトを参考にさせていただきました。
機能としては、スライドショーが自動再生から始まり
アルファのフェードが入りながら画像の数だけループして、
自動再生の一時停止、次ボタンと戻るボタンでスライド内を
移動できるようになっています。
ここまではいいのですが、回線が遅い環境でみると
6枚目くらいから、画像の読み込みがついてこれなくなって
枚数カウントだけが進み、画像が黒のまま表示されなく
なってしまいます。
改善したいポイントとしては、
最初の段階でローディング画面(前処理)を設けて、ある程度
読み込みが完了した時点で自動スライド開始としたいと
思っています。
もしくは、全て画像を読み込み終えてからスライド開始。
これでメモリ不足や回線スピード不足が解消されれば
今回の問題はクリアでるのではないかと考えています。
画像は50枚前後の少し大きめの画像を使用しています。
どうか、お知恵を貸していだだければと思います。
★使用スクリプト
photos_xml = new XML();
photos_xml.load("photo.xml");
photos_xml.ignoreWhite = true;
photos_xml.onLoad = SlideShow;
function SlideShow(success) {
if (success) {
rootNode = photos_xml.firstChild;
Slides_num = rootNode.childNodes.length;
first_Slide = rootNode.firstChild;
last_Slide = rootNode.lastChild;
currentSlide = first_Slide;
currentNo = 1;
passSlide(first_Slide);
ID = setInterval(autoExchange, 5000);
}
}
function passSlide(newSlide) {
image = newSlide.attributes.image;
imageWidth = newSlide.attributes.p_width;
imageHeight = newSlide.attributes.p_height;
slideTitle = newSlide.firstChild.nodeValue;
screen._alpha = 0;
delay = getTimer();
_root.onEnterFrame = function() {
if (getTimer()>delay+200) {
screen._alpha += (100-screen._alpha)/30;
screen._width = imageWidth;
screen._height = imageHeight;
screen._x = 305-imageWidth/2;
screen._y = 220-imageHeight/2;
}
frame._x += (305-imageWidth/2-frame._x)/3;
frame._y += (220-imageHeight/2-frame._y)/3;
frame._width += 2+(imageWidth-frame._width)/3;
frame._height += 2+(imageHeight-frame._height)/3;
};
loadMovie(image, screen);
}
function autoExchange(nextSlide) {
nextSlide = currentSlide.nextSibling;
if (nextSlide == null) {
passSlide(first_Slide);
currentSlide = first_Slide;
currentNo = 1;
} else {
currentNo++;
passSlide(nextSlide);
currentSlide = nextSlide;
}
}
auto_on.onRelease = function() {
ID = setInterval(autoExchange, 4000);
mx.behaviors.DepthControl.sendBackward(this);
};
auto_off.onRelease = function() {
clearInterval(ID);
mx.behaviors.DepthControl.sendBackward(this);
};
next_btn.onRelease = function() {
nextSlide = currentSlide.nextSibling;
if (nextSlide == null) {
passSlide(first_Slide);
currentSlide = first_Slide;
currentNo = 1;
} else {
currentNo++;
passSlide(nextSlide);
currentSlide = nextSlide;
}
};
back_btn.onRelease = function() {
previousSlide = currentSlide.previousSibling;
if (previousSlide == null) {
passSlide(last_Slide);
currentSlide = last_Slide;
currentNo = Slides_num;
} else {
currentNo--;
passSlide(previousSlide);
currentSlide = previousSlide;
}
};
No.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は非常に便利な機能なので、
外部からデータを取って来たとき、関数を実行するとき、計算するとき等
どんどん乱用すると単純なミスを防げます。
No.2
- 回答日時:
中途半端な説明でもうしわけない…;;
>gotoAndPlay('slideshow');のslideshowは
これはスライドショーのあるフレームのラベルを指定します
フレーム番号が2であれば
gotoAndPlay(2);
でも大丈夫です。
>//全画像数を取得。XMLの記述方法で変わってきます
サンプルのXMlを見ると大丈夫そうです。
ようはtotalImagesの値が全画像の枚数と同じであればOK
今回はrootNode.childNodes.lengthからそれを取得しています
> それと根本的なところなんですが
> 1フレーム目に教えていただいたスクリプトを入れて
> 2フレーム目にスライドショーのスクリプト
> とすると、その渡し方はどうなりますでしょうか?
> それぞれstopさせておいていいのでしょうか?
現状1フレームしかないような作りであれば
上記の方法でOKです
全画像が読み込まれるまで1フレーム目でずっとstopしていますので
そこにローディングの画像などを配置します。
基本的に画像やらXMLを読み込む場合は
都度ムービーを止めてローディングするか
先に全部読み込んでからメインのムービーを開始します。
※前者の方がサイトの利用者にとっては良いとは思いますが、作るのがとにかく大変です。
mr_araki 様
詳細な回答ありがとうございます。
教えていただいた通りにやってみて
プレビューしてみましたが
ローデングから次のフレームに移ってくれませんでした。
試しにxmlの画像リストを5枚でやってみましが
フレーム2に進んでくれませんでした。
あと一歩な気がするのですが
申し訳ないです。
今回のスライドでなぜプリロードさせたいかというと
ひとつに、macでスムーズに動くこと
そしてADSL程度の回線を使用されている方でも
画像が飛ばずに見られること
この2つの問題をクリアーするためです。
アルファの処理で、もう処理が追いついてない感じです
実際速い回線のWIN環境でみると
何の問題もないんですが…。
ローディングなしの段階で
FLASH8のダウンロードシュミレートを行ってみると
DSL(32.6kb/s)では、一枚目までは何とか表示できて
2枚目以降からは読み込みが追いつかず
xmlのカウントだけが進んでいってしまいます。
(黒いまま、スライド番号とタイトルだけが一定時間ごとに表示されていく)
今の現状では1フレームの一番上のレイヤーにstopをいれて
下のレイヤーに教えていただいたスクリプトを
そのままいれています。
何か足りないものがあったりするのでしょうか?
何度も答えていただいて本当にありがとうございます
本当に感謝しております。
No.1
- 回答日時:
既存のソースを変更するのは結構めんどうだと思います。
画像を一度読み込んでおくとキャッシュされるので
ひとつ前のフレームで先に読み込むのはどうでしょうか
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させておいていいのでしょうか?
よろしければ再度アドバイスをいただければと思います。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- 英語 下記の英文の日本語訳をお願いします。 1 2023/03/02 10:01
- 英語 下記の英文を日本語に訳して、その意味を教えてください。 1 2023/03/09 14:13
- 英語 下記の英文を日本語に訳してください。 1 2023/03/10 13:04
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- 英語 訳を知りたいです 3 2023/08/24 22:33
- JavaScript jQueryでのレスポンシブが綺麗に動かない 3 2022/06/21 11:08
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- JavaScript 画像の表示位置 3 2022/12/23 08:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 バッファについて。
-
HTMLのフレームとテーブル...
-
ICチップのリードフレームを単...
-
FALSH一部レイヤーだけループ再生
-
[AS3]ループするたびに変数等は...
-
キーフレームとはなんですか?
-
可愛い無料写メフレームサイト
-
シーン逆再生から再生
-
シーンの分割方法
-
ページ移動する間にMCのアクシ...
-
Excel VBA SetFocus
-
PS5やPS4proに関して質問です。...
-
Flashゲームのセーブ機能の作り方
-
再生中のフラッシュ・巻き戻し...
-
WEBブラウザの重複起動の禁止
-
リフレッシュ・レート、フレー...
-
ビルダーでのフレームって縦幅...
-
ホームページに再生ボタン
-
トグルボタンの排他制御でご教...
-
Suzukaで時計のflashを作成し、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#でDLLファイル読み込みを行う...
-
C言語 バッファについて。
-
GetPrivateProfileString変値
-
SDHCカードのデータをPCに取り...
-
画像が一瞬とぎれてしまいます...
-
ipadでdブックがとんでもなく遅...
-
PIC EEPROM
-
ヤフオクの画像拡大機能が
-
XMLを利用したFLASH画像ギャラ...
-
SQLが応答しなくなっているのか...
-
C#でブラウザのタイムアウト処理
-
メールソフト「Mail」で送った...
-
PCでのツイッター閲覧について
-
空の音楽用CDーRだけが認識...
-
エクセルVBA読み込みアドレスの...
-
FLASH内MCの表示・非表示
-
Flashで右クリックメニューにつ...
-
フレーム内に移動したい
-
ソーラーパネルのアルミフレー...
-
HPを作りたい
おすすめ情報