Hatena::Groupsubtech

#生存戦略 、それは

-> 07 { 03 / 14 }

flex2/as3 の Embed/Binding メモ

21:39 | はてなブックマーク - flex2/as3 の Embed/Binding メモ - #生存戦略 、それは

画像や音をコンパイル時に組み込んでくれるよ。

    [Embed(source="example.jpg")]
    [Bindable]
    public var ExampleImage:Class;

とか class の内側に書き、クラスから呼び出す。ファイルパスは書き込んだソースからの相対パス、もしくは絶対パス(試してないけど)で。

で、Bitmap として使いたかったら

var exampleBitmap:Bitmap = Bitmap(new ExampleImage);

とかすれば扱える。mx コンポーネントを import しなくても使えた。これは flex2 の機能なのか mxmlc の機能なのか?[jitensya] な syntax って as3 にあったっけ?flex_devguide.pdf を検索したけどそれっぽい説明がなかったので追ってみる。

まずコンパイラの設定を見る。flex-config.xmlメタデータとして定義されてる。

<!-- Keep the following AS3 metadata in the bytecodes.                                             -->
<!-- Warning: For the data binding feature in the Flex framework to work properly,                 -->
<!--          the following metadata must be kept:                                                 -->
<!--          1. Bindable                                                                          -->
<!--          2. Managed                                                                           -->
<!--          3. ChangeEvent                                                                       -->
<!--          4. NonCommittingChangeEvent                                                          -->
<!--          5. Transient                                                                         -->
<keep-as3-metadata>
    <name>Bindable</name>
    <name>Managed</name>
    <name>ChangeEvent</name>
    <name>NonCommittingChangeEvent</name>
    <name>Transient</name>
</keep-as3-metadata>

へぇ(よくわかんないけど)。というわけで -keep オプション付きでコンパイルしてみてジェネレートされる *.as ファイルを見てみる。

package
{

import mx.core.BitmapAsset;

[ExcludeClass]
[Embed(exportSymbol="ColorMatrixFilterExample_ExampleImage", _resolvedSource="/path/to/example.jpg", source=
"example.jpg", _file="/path/to/ColorMatrixFilterExample.as", _column="10", _line="13")]

public class ColorMatrixFilterExample_ExampleImage extends mx.core.BitmapAsset
{
    public function ColorMatrixFilterExample_ExampleImage()
    {
            super();
    }

}

}

BitmapAsset の子クラスとして定義されてる。よしなに BitmapAsset/SoundAsset/FlexMovieClip なんかを生成してくれるのかな。

Binding で定義したクラスは BindableProperty なクラスに setter/getter でまとめられている。また mx.utils.ObjectProxy 周り使って、更新があったらイベント起こせるようになってるのかな。そのため Binding オブジェクトの値の変更があったらすぐに mxml での表示を変更できると。へぇ。

import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import mx.core.IPropertyChangeNotifier;
import mx.events.PropertyChangeEvent;
import mx.utils.ObjectProxy;
import mx.utils.UIDUtil;

import Class;

class BindableProperty
{
        /**
         * generated bindable wrapper for property ExampleImage (public)
         * - generated setter
         * - generated getter
         * - original public var 'ExampleImage' moved to '_54677041ExampleImage'
         */

    [Bindable(event="propertyChange")]
    public function get ExampleImage():Class
    {
        return this._54677041ExampleImage;
    }

    public function set ExampleImage(value:Class):void
    {
        var oldValue:Object = this._54677041ExampleImage;
        if (oldValue !== value)
        {
                        this._54677041ExampleImage = value;
            dispatchEvent(mx.events.PropertyChangeEvent.createUpdateEvent(this, "ExampleImage", oldValue, value));
        }
    }
}
トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20070314