サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

MovieClip.onLoadイベントハンドラメソッド

ID: FN0604002 Product: Flash

Platform: All
Version: MX 2004 and above

シンタックス[*1]
onLoad = function() { }

[訳者注*1] ActionScript 2.0で戻り値を型指定するなら、つぎのようになります。

onLoad = function ():Void { };

また、関数・メソッドとして、明示的に定義することもできます。

function onLoad ():Void {
   //  処理のステートメントを記述
}

説明
MovieClipがインスタンス化され、(訳者注: その配置された親の)タイムラインに表示されるときに呼出されます。このイベントハンドラが呼出されたときに実行すべき関数(function)を、定義する必要があります。関数(function)は、タイムラインに定義することができます[*2][*3]。また、MovieClipクラスを継承するクラスや、[ライブラリ]内のシンボルにリンケージ設定したクラス中に定義することも可能です[*4]。

このハンドラは、[ライブラリ]内のシンボルがクラスと関連づけられている、MovieClipインスタンスに対してのみ使用することができます。イベントハンドラを特定のMovieClipがロードされたときに呼出すには、このハンドラでなくonClipEvent (load)またはMovieClipLoaderクラスを使用する必要があります。たとえば、MovieClip.loadMovie()を使ってSWFファイルを動的にロードした場合です。MovieClip.onLoadとは異なり、onClipEvent (load)ハンドラやMovieClipLoaderクラスのリスナーイベントは、MovieClipがロードされれば呼出されます[*5]。

[訳者注*2] MovieClipインスタンスを配置したタイムラインに、このイベントハンドラメソッドを定義して動作する場合は、かなり限定されます。実際上は、タイムラインに定義することはまれで、またその使用も適切とはいえない場合が少なくないでしょう。

たとえば、タイムラインにつぎのフレームアクション(スクリプト001)を設定しても、通常は動作しません。ところが、そのインスタンスにMovieClipアクションを何かしら設定(最低限半角スペースひとつでも可)すると、MoiveClip.onLoadイベントハンドラメソッドが呼出されるようになります。

スクリプト001■MovieClipを配置したタイムラインのフレームアクションでMovieClip.onLoadメソッドを設定

// フレームアクション
// MovieClipインスタンスmy_mcを配置
var my_mc:MovieClip;
my_mc.onLoad = function() {   // 呼出されない
   trace(this);
};

メインタイムラインの第1フレームで_level0(_root)に設定したMovieClip.onLoadイベントハンドラメソッドは、呼出されるようです(スクリプト002)。しかし、ブラウザで確認すると、MozillaベースのブラウザSafariでは呼出されないという報告がされています(Flash Player 7)。

スクリプト002■第1フレームアクションでメインタイムライン自身にMovieClip.onLoadメソッドを設定

// メインタイムライン: _level0
// 第1フレームアクション
this.createTextField("my_txt", 1, 10, 10, 100, 20);
var my_txt:TextField;
this.onLoad = function() {
   my_txt.text = this;
};

上記ふたつのサンプル(スクリプト001および002)では、MovieClip.onLoadイベントハンドラメソッドの呼出しが確実でなく、正規にサポートされる動作であるかも疑問です。イベントハンドラを設定するにはインスタンス(タイムライン)が存在しなければならず、それがすでに存在するのであればロードは済んでいると考えられるからです。

[訳者注*3] ここで「タイムラインに定義」というのは、ActionScript 1.0で#initclipブロックにクラスを定義した場合を意味しているのかもしれません(スクリプト003)。クラス定義でMovieClip.onLaodイベントハンドラメソッドを設定すれば、インスタンスのロード時にメソッド(コールバック関数)はつねに正しく呼出されます。

スクリプト003■MovieClipの第1フレームアクションでActionScript 1.0クラス定義

// シンボルリンケージ識別子: "mySymbol"
// 第1フレームアクション
// ActionScript 1.0クラス定義
#initclip
function MyClass() {
}
Object.registerClass("mySymbol", MyClass);
MyClass.prototype = new MovieClip();
MyClass.prototype.onLoad = function() {
  trace(this);  // インスタンスのパスが出力
};
#endinitclip

[訳者注*4] MovieClipを継承しただけでは、MovieClip.onLoadを始めとするMovieClipクラスのイベントハンドラメソッドは呼出されません(スクリプト004)。new演算子でコンストラクタ関数を呼出してインスタンスを生成しても、[出力]パネルには以下のようにコンストラクタの呼出し結果しか表示されません。

[出力]:
instantiated,[object Object]

スクリプト004■MovieClipを継承しただけではイベントハンドラメソッドは呼出されない

// ActionScript 2.0クラス定義ファイル: MyClass.as
class MyClass extends MovieClip {
  function MyClass() {
    trace(["instantiated", this]);
  }
  function onLoad():Void {
    trace(["loaded", this]);
  }
}

イベントハンドラメソッドが呼出されるためには、MovieClipシンボルにクラスを関連づける必要があります。ActionScript 2.0クラスは、[シンボルプロパティ]の[AS 2.0クラス]に指定します(図001)。

図001■[シンボルプロパティ]の[AS 2.0クラス]にクラスを設定

そうすると、そのMovieClipインスタンスがフレームに配置されたとき、コンストラクタについでMovieClip.onLoadイベントハンドラメソッドが呼出されます。MovieClipをメインタイムラインに配置して、インスタンス名をmy_mcとすると、[出力]パネルにはつぎのように表示されます。

[出力]:
instantiated,_level0.my_mc
loaded,_level0.my_mc

したがって、「MovieClipクラスを継承するクラス」だけでは、イベントハンドラメソッドを呼出すには不十分です。併せて、「シンボルにリンケージ設定したクラス」にする必要があります。

[訳者注*5] onClipEvent (load)イベントハンドラアクションは、外部SWFがロードされなくても、タイムラインに配置された時点で1度呼出されます。ですから、外部SWFのロード時にのみ行いたい処理は、onClipEvent (data)ハンドラに記述する方が扱いやすいでしょう(「MovieClip.loadMovieで外部ファイルを読込む」参照)。


この例は、onLoadイベントハンドラについて、MoiveClipクラスを継承したActionScript 2.0クラス定義でどのように使うかをご紹介します。第1に、クラスファイルを作成し、Oval.asと名前をつけます。そして、onLoadという名前で、クラスのメソッドを定義します。クラスファイルは、適切なクラスパスに配置したことを確認してください。クラス定義のサンプルは、以下のとおりです[*6]。

// Oval.asの内容
class Oval extends MovieClip {
  public function onLoad():Void {
    trace("onLoad called");
  }
}

第2に、[ライブラリ]にMovieClipシンボルを作成して、Ovalというシンボル名をつけます。[ライブラリ]パネルのシンボル上でコンテクストメニュー(右クリック)を表示し、ポップアップメニューから[リンケージ]を選びます。[ActionScriptに書き出し]のオプションをクリックしたら、[識別子]と[AS 2.0クラス]のフィールドにOvalと入力します。[最初のフレームに書き出し]のオプションが選択された状態で、[OK]をクリックします[*7]。

第3に、ムービーファイルの第1フレームに移動し、[アクション]パネルにつぎのコードを入力します。

var myOval:Oval = Oval(attachMovie("Oval", "Oval_1", 1));

最後に、[ムービープレビュー]を実行すると、[出力]のテキストに"onLoad called"と表示されます[*8]。

[訳者注*6] 原文ではonLoadメソッドの戻り値に、型指定はされていません。

[訳者注*7] 以下の図002をご参照ください。

図002■[リンケージプロパティ]の設定

[訳者注*8] MovieClip.onLoadイベントハンドラメソッドは、コンストラクタ関数の直後に、1度だけ呼出されます。プロパティなどの通常の初期化であれば、コンストラクタから初期化用のメソッドを呼出せばよく、さらに加えてonLoadメソッドで処理を行う必要はないでしょう。

コンストラクタでは実行が早すぎ、onLoadイベントの呼出しを待たなければならない例としては、MovieClip内にコンポーネントを配置した場合が考えられます。MovieClipのタイムラインに配置されたコンポーネントは、MovieClipがインスタンス化されてコンストラクタ関数が呼出された時点では、まだ初期化されていません。したがって、MovieClip内のコンポーネントに初期設定を行う際には、onLoadメソッドにその処理を記述すべき場合があります。

たとえば、MovieClipシンボルの第1フレームに、TextAreaコンポーネントのインスタンスmyTextAreaを配置したとします(図003)。

図003■MovieClip内にTextAreaコンポーネントを配置

MovieClipシンボルに関連づけたActionScript 2.0クラスのコンストラクタ関数で、TextAreaコンポーネントのTextArea.textプロパティに文字列を設定しても、テキストは表示されません。タイムラインに配置されたTextAreaコンポーネントインスタンスが、まだ初期化されていないからです。クラスにonLoadメソッドを追加して、その中でTextArea.textプロパティを設定すれば、テキストが正しく表示されます(スクリプト005)。

スクリプト005■ActionScript 2.0クラス定義内でMovieClip.onLoadメソッドを設定

// ActionScript 2.0クラス定義ファイル: MyClass.as
import mx.controls.TextArea;
class MyClass extends MovieClip {
  var myTextArea:mx.controls.TextArea;
  function MyClass() {
    // myTextArea.text = "test"; // TextArea.textプロパティが設定できない
  }
  function onLoad():Void {
    myTextArea.text = "test";
  }
}

なお、MovieClipのタイムラインにコンポーネントを予め配置しておくのでなく、コンストラクタからUIObject.createClassObject()メソッドなどを使って動的に配置したコンポーネントであれば、インスタンスの作成後ただちにプロパティなどの初期設定を行うことができます。

Player
ActionScript 1.0/Flash Player 6.0以降。

出典
[ActionScript 2.0 Language Reference] > [ActionScript classes] > [MovieClip] > [onLoad (MovieClip.onLoad handler)] より邦訳。

_____

作成者: 野中文雄
作成日: 2006年4月6日 Flash MX 2004のドキュメントにもとづく同名のFN0503003を全面改訂


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.