• 締切済み

画像読み込みとリスナーオブジェクト

下記スクリプトが上手く理解できずに混乱中です。 var mcLoader:MovieClipLoader = new MovieClipLoader(); var listenerObject:Object = new Object(); listenerObject.onLoadInit = function() { photoFrame._width = 120; photoFrame._height = 160; }; mcLoader.addListener(listenerObject); mcLoader.loadClip("photo001.jpg", photoFrame); 上記は画像を読み込み、指定サイズに調整する というASですが、上手く理解できずにおります。まず、 var mcLoader:MovieClipLoader = new MovieClipLoader(); mcLoader.loadClip("photo001.jpg", photoFrame); で、画像を読み込み、を学びました。 ここに単純にサイズ指定のASを追加しても、画像読み込み完了より先にサイズ指定が実行されてしまうため、指定サイズにならない場合がある。なのでリスナーオブジェクト(この単語も説明は読んだのですがいまいち理解しておりません)を作成使用し、画像ロードが完了した事を確認後、画像サイズを調整する という段階を踏ませるために、 ar listenerObject:Object = new Object(); listenerObject.onLoadInit = function() { photoFrame._width = 120; photoFrame._height = 160; }; mcLoader.addListener(listenerObject); を追加する。という説明まではよいのですが、この追加コード部分の内容がよく分かりません。 まずこのコードは実際どのような流れにになるのでしょうか? 「実際の流れ」というとおかしな表現になってしまうのですが、例えば、 function FuncName(){ this._x += 10; } MC01.onRelease = FuncName; は、 MC01がクリックされたとき、 MC01.onRelease = FuncName; ファンクションが呼び出され、 function FuncName(){ this._x += 10; } ファンクションが実行される。 という流れという説明をつけられるとおもうのですが、実際の描画の流れとでもいえばよいのでしょうか、最初に上げた画像読み込みのコードはどのような順で実行されるものなのでしょうか? 何がわかっていないかがわからない的な部分もあり、少々不明瞭な説明になってしまっているかもしれないですが、できうる範囲でアドバイスやご説明をいただけたらと思います。 よろしくお願いします。

  • Flash
  • 回答数1
  • ありがとう数1

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

追加部分はこれですね↓。 ----------------------------------- //オブジェクトの作成 var listenerObject:Object = new Object(); //何らかのイベント発生時の動作定義 listenerObject.onLoadInit = function() { photoFrame._width = 120; photoFrame._height = 160; }; //あるオブジェクトに イベントリスナーが呼び出されたときに通知を受けるオブジェクトを登録 mcLoader.addListener(listenerObject); ----------------------------------- > このコードは実際どのような流れにになるのでしょうか? 流れは単純に上から順です。 // オブジェクトの作成   ↓ // 何らかのイベント発生時の動作定義   ↓ // あるオブジェクトに イベントリスナーが呼び出されたときに通知を受けるオブジェクトを登録 しかしこれは, 動作定義や登録をしているだけで,実際の動作は何も起こりません。 mcLoader に何かがロードされ,ロードされたものが表示されると同時に // 何らかのイベント発生時の動作定義 で定義した動作が起こります。 前半と後半に分けて考えますか。 /////////////////////////////////////////////////////////////////////// 追加部分の前半はこれです↓。 ----------------------------------- //オブジェクトの作成 var listenerObject:Object = new Object(); //何らかのイベント発生時の動作定義 listenerObject.onLoadInit = function() { photoFrame._width = 120; photoFrame._height = 160; }; ----------------------------------- まず,オブジェクトを作成して, そのオブジェクトに対する何かのイベント発生時の動作を定義しています。 上の例では実際のものが目で見えないので観察しにくいです。 目で見えるような形で上と同じような例を書きます。 Flash 8 以降 AS2 スタイル で書いた例です↓。 ------------------------------------------------------------- //オブジェクトの作成 var txtField:TextField = _root.createTextField("myField", 0, 30, 100, 200, 50); txtField.border = true; //何らかのイベント発生時の動作定義 txtField.onSetFocus = function() { myField.text = "フォーカスを受けました"; }; ------------------------------------------------------------- Flash 8 以降をお持ちでない場合はスタイルが変わってしましますが, 上と全く同じ内容のものをFlash MX 2004 以前の形式で書くとこうなります↓。 -------------------------------------------------------- //オブジェクトの作成 _root.createTextField("myField", 0, 30, 100, 200, 50); myField.border = true; //何らかのイベント発生時の動作定義 myField.onSetFocus = function() { myField.text = "フォーカスを受けました"; } -------------------------------------------------------- 新規ドキュメントのフレーム1に書いて, パブリッシュもしくはムービープレビューしてもらうと,すぐに動作確認ができます。 これ↑と同様に考えるとわかりやすくなるような気がします。 MovieClipLoader.onLoadInit も TextField.onSetFocus も イベントリスナー(イベントハンドラメソッドの拡張版)です。 MovieClipLoader と TextField との違いは, MovieClipLoaderオブジェクトは,別にコールバック通知を待機するオブジェクトが必要ですが, TextField はコールバック通知を待機する機能を内包しているという点です。 そこは違いますが, 結局,MovieClipLoader.onLoadInit も TextField.onSetFocus も 何かのイベントが発生したときの動作を定義できるイベントリスナーには違いはありません。 「ロードしたものが表示されるとき」 の動作を定義できるイベントリスナーか, 「テキストフィールドがフォーカスを受けたとき」 の動作を定義できるイベントリスナーかという違いだけです。 > 「実際の流れ」というとおかしな表現になってしまうのですが、例えば、 > function FuncName(){ > this._x += 10; > } > MC01.onRelease = FuncName; > は、 それは例が違いすぎるのでわからないのだと思います。 形が違うので比較のしようがありません。 匿名関数で書くところをバラしているわけですから, バラさずに同じような書き方をするとこうなります↓。 ---------------------------- //何らかのイベント発生時の動作定義 MC01.onRelease = function() { this._x += 10; }; ---------------------------- この場合, MC01 は手動で作成してあると思うので, var listenerObject:Object = new Object(); とか var txtField:TextField = _root.createTextField… のような, MC01オブジェクト 作成のためのスクリプトが上に付いていないだけです。 あえて MC01オブジェクト 作成の部分まで付けると次のような感じになります。 ---------------------------------------- //オブジェクトの作成 _root.createEmptyMovieClip("MC01", 1); MC01._x = 100; MC01._y = 100; with (MC01) { beginFill(0x00EEEE); moveTo(0, 0); lineTo(80, 0); lineTo(80, 60); lineTo(0, 60); lineTo(0, 0); } //何らかのイベント発生時の動作定義 MC01.onRelease = function() { this._x += 10; }; ---------------------------------------- これも新規ドキュメントのフレーム1に書いて, パブリッシュもしくはムービープレビューしてもらうと,すぐに動作確認ができます。 MovieClip.onRelease は, イベントハンドラ ですが,イベントリスナーのようなものなので同じと考えて良いです。 ただし, 上の2例でも動作定義をしているだけで,実際の動作は何も起こりません。 "テキストフィールドを選択したとき" または,"MC01をクリックしたとき" に, //何らかのイベント発生時の動作定義 で定義した動作が起こります。 /////////////////////////////////////////////////////////////////////// そして,追加部分の最後がこれです↓。 ---------------------------------------- //あるオブジェクトに イベントリスナーが呼び出されたときに通知を受けるオブジェクトを登録 mcLoader.addListener(listenerObject); ---------------------------------------- 作成したオブジェクトは単なるオブジェクトとそのイベントリスナーに過ぎません。 つまり,mcLoader というオブジェクトに対するリスナーオブジェクトとして登録しないと,mcLoader の監視はしてくれません。 そこで,mcLoader というオブジェクトの監視をするように登録しているのです。

thank001
質問者

お礼

BlurFiltanさん、書き込みありがとうございます。 参考にさせて頂いております。 現在、わからない部分など調べながら読解中です。 とりあえず時間もかかりそうなので、書き込みをしかも長文でいただいた事にお礼をさせて頂きたいと思い書き込みさせていただきました。

関連するQ&A

  • イベントハンドラメソッドが実行される?

    環境 Flash8 / FlashPlayer8 lis.onLoadInitが何故実行されるのか理解できないので 教えてください。 私の考えは、lisはローカル変数なので、startLoadの実行が終わると lisが破棄されるので、list.onLoadInitが実行されないと思ったのですが list.onLoadInitが実行されてます。 *サンプルコード function startLoad():Void { var container:MovieClip = createEmptyMovieClip("container", getNextHighestDepth()); var mcLoader:MovieClipLoader = new MovieClipLoader(); var lis = new Object(); lis.onLoadInit = function() { trace(1); } mcLoader.addListener(lis); mcLoader.loadClip("***", container); } startLoad();

    • ベストアンサー
    • Flash
  • actionscript2.0で外部写真データの読み込み、表示が出来な

    actionscript2.0で外部写真データの読み込み、表示が出来ない FlashCS4 actionscript2.0 Win7 を使っています。 var mcLoader:MovieClipLoader = new MovieClipLoader(); var listenerObject:Object = new Object(); listenerObject.onLoadInit = function() { photoFrame._width = 758; photoFrame._height = 505; }; mcLoader.addListener(listenerObject); mcLoader.loadClip("001.jpg", photoFrame); PC上で確認しているときは写真サイズもちゃんと変更されて表示されるのですが web上にupするとなにも表示されません。 このような場合はどのように対処してゆけばよろしいのでしょうか? よろしくお願いします

    • ベストアンサー
    • Flash
  • 画像の読み込みについて

    複数の画像を順番に読み込んで表示させようと考えています。 例えば以下のような形で、MovieClipLoaderを使って読み込もうとする場合、どのようにすればよいでしょうか。 イメージとしては、下記最後のfor文の中で読み込んでいる部分が、 順番に、1つ目の画像が読み込みが完了したら、2枚目の画像の読み込みのような形になると良いのですが。 よろしくお願いします。 var listener:Object = new Object(); listener.onLoadComplete=function(){ trace("onLoadComplete"); } listener.onLoadInit = function() { }; listener.onLoadProgress=function(target_mc,loadedBytes,totalBytes){ trace("onLoadProgress:"+":"+loadedBytes+"/"+totalBytes); } listener.onLoadStart=function(){ trace("onLoadStart"); } var loader:MovieClipLoader = new MovieClipLoader(); loader.addListener(listener); for(var i=0;i<10;i++){ loader.loadClip("hoge.jpg", this['image'+i].img); }

    • ベストアンサー
    • Flash
  • 外部読み込みについて

    親のSWFに子のSWFを外部読み込みさせて動作させようとしています。 子のSWFを読み込むことは問題ないのですが、子の中の動作がうまく実行できません。  「子のSWF」と言っているものは、サムネイルが並んでいて、それをクリックしたら所定の場所に写真を読み込むというものです。 「子のSWF」に関して、写真の外部読み込みは以下の方法でやっており、これだけでしたら問題なく動作します。 ============================================ var mcLoader:MovieClipLoader = new MovieClipLoader(); var listenerObject:Object = new Object(); listenerObject.onLoadStart = function(mc) { mc._visible = false; loading._visible = true; }; listenerObject.onLoadInit = function(mc) { mc._visible = true; loading._visible = false; }; mcLoader.addListener(listenerObject); loading._visible = false; _root.photo01_button.onRelease = function() { mcLoader.loadClip("04collection/photo01.jpg",photoBox); }; _root.photo02_button.onRelease = function() { mcLoader.loadClip("04collection/photo02.jpg",photoBox); }; _root.photo03_button.onRelease = function() { mcLoader.loadClip("04collection/photo03.jpg",photoBox); }; ============================================ 理想は、上記の「子のSWF」を「親のSWF」に読み込んで、サムネイルをクリックしたら狙った写真を読み込むようにしたいのですが、子だけでは問題なく動作していても、それを親に読み込んだ状態では全く機能しません。 読み込みたい写真のルートが問題とかであれば何かしら反応はありますが、サムネイルをクリックしても、全く反応がありません。 このような何重かの外部読み込みを定義することはできないのでしょうか。 環境はFlash CS3 for Winです。 どなたか問題解決の方法をご存じの方がいらっしゃいましたら宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 絶対パスの書き方

    絶対パスの書き方 今使っているレンタルサーバーでは絶対パスは/var/www/vhosts/(ドメイン名)/httpdocs と書いてあります。もしドメイン名が1234.comだったら/var/www/vhosts/1234.com/httpdocs となると思うのですが、うまく書き方が解りません。 actionscript2.0で外部ファイルを読み込んでいます。 var mcLoader:MovieClipLoader = new MovieClipLoader(); var listenerObject:Object = new Object(); listenerObject.onLoadInit = function() { photoFrame01._width = 757; photoFrame01._height = 500; }; mcLoader.addListener(listenerObject); mcLoader.loadClip("music001/1.jpg",photoFrame01); で相対パスは出来るのですが、絶対パスが解りません。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flashで外部読み込み画像の縦横比を維持したままリサイズするには?

    Flashで、外部読み込み画像を、指定したサイズにリサイズして読み込みたいと思い、 ネットで色々と検索してみて、下記のスクリプトに辿り着いたのですが、 このスクリプトだと、読み込む画像の縦横比が、サイズ指定した縦横比と違った場合でも、 無理矢理に指定したサイズの縦横比にリサイズされて読み込まれてしまいます。 要点を掻い摘んで説明すると、、、 ========================================================== 読み込む画像の、 横幅が 120以上の大きさなら、横幅を 120にリサイズして、 縦の大きさは、それに比例して縮小。 縦の大きさが 160以上なら、縦の大きさを 160にリサイズして、 横幅は、それに比例して縮小。 ========================================================== と言った事がしたいのです。 ↑上記のように、縦横比を維持したまま、外部読み込み画像を リサイズして読み込むには、一体どうすれば良いのでしょうか? ネットで丸1日かけて調べてみましたが、どうしても、その方法が分からず、 途方に暮れています。 どなたか、Flashで外部読み込み画像の縦横比を維持したままリサイズする方法を ご存知の方が居られましたら、何卒ご教示よろしくお願い致しますm(_ _)m --------------------------------------------------- var mcLoader:MovieClipLoader = new MovieClipLoader(); var listenerObject:Object = new Object(); listenerObject.onLoadInit = function() { photoFrame._width = 120; photoFrame._height = 160; }; mcLoader.addListener(listenerObject); mcLoader.loadClip("photo001.jpg", photoFrame); --------------------------------------------------- 環境 / win XP / Flash CS3 / アクションスクリプト 2.0

    • ベストアンサー
    • Flash
  • 外部の画像を読み込んで並べたい

    お世話になります。外部の画像を読み込み、それを縦に並べるだけで、 難しいことは無い、と思って挑戦しましたが、すでにハマって、時間だけが過ぎております。 var btnlength = 7;//並べるボタン画像の数 var btncount=1; var oLsn:Object = new Object(); var myMcLoader:MovieClipLoader //読み込み成功時 oLsn.onLoadInit = function(mc:MovieClip) { mc._y = setbtn_y ; setbtn_y = setbtn_y + mc._height; btncount++; if (!(btncount > btnlength)){ create_btn(btncount); } } //ボタンMC作成 function create_btn(_cnt){ var _mc:MovieClip = this.createEmptyMovieClip("btn"+btncount, this.getNextHightestDepth()); myMcLoader.loadClip("img/btn"+ _cnt +".png",_mc); } myMcLoader = new MovieClipLoader(); myMcLoader.addListener(oLsn); create_btn(1); やろうとしていることは、 MovieClipLoaderを使って、狙いの画像を読み出し、 読み込まれた後に、次の画像を読み出す。 という仕様です。 現状では、一番最後の、7番目の画像のみが、7番目の位置に表示されます。それ以前の画像は表示されません。 それ以前の画像が、読み込まれていないのかと思い、onProgressや、エラーも見張ってみたのですが、問題無く読み込まれていました。 なぜ、表示されないのでしょうか? ご教授いただければ、幸いでございます。

  • Flashのワイプ効果について質問します。

    Flashのワイプ効果について質問します。 (バージョンは、都合によりProfessional 8を使っています) 表現したいこと (1)読み込んだ画像が、上から溶けるように消えてゆき、次の画像が出てくる (2)(1)を何枚かの画像でループさせる これをactionscriptで表現したいのですが、組んだスクリプトでは直線的に切るようにしか変化させられません。 実際のスクリプトは以下の通りです。分かる方はアドバイスをお願いいたします。 import mx.transitions.*; import mx.transitions.easing.*; //3枚の画像を用意 var picTotal = 3; this.createEmptyMovieClip("load_mc", 1); load_mc._x = 427; load_mc._y = 0; var n = 0; var interval = 3000; setPic(); //画像切り替え function setPic() { loadPic(n); if (n>=picTotal-1) { n = 0; } else { n++; } } ID = setInterval(setPic, interval); //画像の読み込み function loadPic(n) { var mcLoader:MovieClipLoader = new MovieClipLoader(); jpg = "image/"+n+".jpg"; mcLoader.loadClip(jpg,load_mc); var oListener:Object = new Object(); oListener.onLoadInit = function() { transPic(); }; mcLoader.addListener(oListener); } //画像の変化(ワイプ効果) function transPic() { var myTransition:TransitionManager = new TransitionManager(load_mc); myTransition.startTransition({type:Wipe, direction:Transition.OUT, duration:2, numStrips:64, dimension:1, easing:Strong.easeOut}); }

    • ベストアンサー
    • Flash
  • 時間毎に変わる外部ファイルイメージの読み込み

    初めて投稿させて頂きます。 Flashで時間毎に外部JPGファイルを、1つのムービークリップに自動で 読み込むといったアクション・スクリプトを、此処の過去の質問の回答 などから探して、下記のようなスクリプトを書いたのですが、 ------------------------------------- アクションレイヤー   |フレーム1 読み込みMC配置レイヤー |フレーム1 ------------------------------------- ------------------------------------------------------ var mcLoader:MovieClipLoader = new MovieClipLoader(); var listener:Object = new Object(); mcLoader.addListener(listener); var myDate = new Date(); var myHour = myDate.getHours(); if (myHour>=4 || myHour<10) { mcLoader.loadClip("morning.jpg", mov_mc); } else if (myHour>=10 && myHour<16) { mcLoader.loadClip("noon.jpg", mov_mc); } else if (myHour>=16 && myHour<19) { mcLoader.loadClip("evening.jpg", mov_mc); } else if (myHour>=19 && myHour<4) { mcLoader.loadClip("night.jpg", mov_mc);} ------------------------------------------------------ このスクリプト(↑)だと、 ------------------------------------------- if (myHour>=4 || myHour<10) { mcLoader.loadClip("morning.jpg", mov_mc);} ------------------------------------------- ↑のスクリプト部分の外部JPGファイルしか読み込んで(表示して)くれず、 他の外部JPGファイルを一切読み込んで(表示して)くれません。 自分なりに色々と試行錯誤してみたのですが、 何がどう悪いのかも、さっぱり理解出来ず、 どうしたら良いのか途方にくれています。。。 どなたか、この問題を解決する方法がお分かりになられる方が おられましたなら、どうかご教授下さいませんでしょうか? ○環境 : Win XP / Flash CS3 / As 2.0 何卒よろしくお願い申し上げますm(_ _)m

    • ベストアンサー
    • Flash
  • flash MovieClipLoaderに関して

    var mcLoader:MovieClipLoader = new MovieClipLoader(); var listenerObject:Object = new Object(); listenerObject.onLoadStart = function(){ createEmptyMovieClipで空のMCを作成。 ライブラリ内にあるMC(文字が点滅するアニメーション。仮にtenmetsuとします。)を attachMovieで割り当て、読み込み中だけ画面に表示させる。 } listenerObject.onLoadInit = function() { removeMovieClipで先程createEmptyMovieClipで作成したMCを削除。 よって文字点滅アニメーションが消える。 }; mcLoader.addListener(listenerObject); mcLoader.loadClip("xyz.swf",yomikomi); -------------------------------------------------------------- 上記のようなスクリプトで、外部のxyz.swfをyomikomiインスタンスに読み込んでいます。 xyz.swfが100%完全に読み込まれた時にyomikomiに表示させたいのですが、 上記スクリプトでは8~9割程度読み込まれた時点で表示されているようです。(泣) 実行した結果xyz.swfの最初の方のフレームを再生している時もtenmetsuが表示されたままで、3秒位したら消えます。 このtenmetsuが消えた瞬間がまさにonLoadInitで、xyz.swfが100%完全に読み込まれた状態だと思うのですが・・・ xyz.swfが100%完全に読み込まれた時に初めてyomikomiに表示させるにはどうすればよいのでしょうか?? ご教授願います。m(_ _)m

専門家に質問してみよう