2010年6月7日月曜日

Utils.as

package {
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    
    /**
     * とりあえず、静的な便利メソッドを入れ込んでおくクラス。
     * 
     * TODO: Air 以外の開発をする際に、Air 専用とそれ以外を分離しましょう。
     * 
     * 方針
     *         ・ActionScriptはオーバーロードができないので、メソッド名に引数情報もいれる。
     *         ・見かけの簡潔さを求めず、分かりやすさを求める。初めて見る人でもシグニチャだけで機能を確実に理解できることを目指す。
     *         ・管理しきれなくなって『具体的に困る』ことになったら別ライブラリへの分割を考える。
     */
    public class Utils {
        
        /**
         * 指定された XML ファイルを読み込み XML オブジェクトを返します。
         */
        public static function readXmlFromFile(xmlFile:File):XML {
            return new XML(readUTFBytesFromFile(xmlFile));
        }
        
        /**
         * 指定されたファイルを読み込み UTFBytes を返します。
         */
        public static function readUTFBytesFromFile(utfFile:File):String {
            var fileStream:FileStream = new FileStream();
            fileStream.open(utfFile, FileMode.READ);
            var utfBytes:String = fileStream.readUTFBytes(utfFile.size);
            fileStream.close();
            return utfBytes;
        }
        
        /**
         * 指定されたファイルに対して指定された XML を書き込みます。
         */
        public static function writeXmlToFile(xml:XML, file:File):void {
            writeUTFBytesToFile(xml.toXMLString(), file);
        }
        
        /**
         * 指定されたファイルに対して UTFBytes を書き込みます。
         */
        public static function writeUTFBytesToFile(utfBytes:String, file:File):void {
            var fileStream:FileStream = new FileStream();
            fileStream.open(file, FileMode.WRITE);
            fileStream.writeUTFBytes(utfBytes);
            fileStream.close();
        }
        
        /**
         * 指定されたファイルをファイルシステム中に作成します。既に指定されたファイルが存在する場合には何もしません。
         */
        public static function createFile(file:File):void {
            if (!file.exists) {
                var fileStream:FileStream = new FileStream();
                fileStream.open(file, FileMode.WRITE);
                fileStream.close();
            }
        }
    }
}

2010年6月2日水曜日

FlashのUI系コンポーネント調査

FlashのUI系のコンポーネントについて全く知識がないので、少し調査してみました。

クラス階層

Object
・言うまでもなく、あらゆるクラスのベースとなるクラス。特にUIであるかどうかとは無関係。
・パッケージはトップレベル。

flash.events.EventDispatcher
flash.events.IEventDispatcher の実装クラス。
・イベントを扱うための汎用的な機能を持つクラス。リスナーの追加削除とかイベントの送信とか。
・特にUIであるかどうかとは無関係。

flash.display.DisplayObject
・display list に配置されるすべてのオブジェクトのベースクラス。
・x,y,zとかalphaとかwidthとかvisibleとかマウス位置とか、表示されるものとしての基本機能を持っている。

flash.display.InteractiveObject
・表示されるオブジェクトでマウスやキーボードやその他の入力デバイスを扱うものすべての抽象クラス。
・このクラスはnewできないし、上記までのクラスもUIを作成するうえでプログラマが明示的に new することはなさそうです。

flash.display.DisplayObjectContainer
・display object の入れ物クラス。
・z 軸上に複数の display object を child として配置できる。
・このサブクラスには Loader, Sprite, Stage, TextLine があります。

flash.display.Loader
・java の ClassLoader のようなものを想像していると DisplayObjectContainer のサブクラスということに違和感を感じるが、実際は swf ファイルおよび画像ファイルをロードして表示するものなので、表示オブジェクトのローダーと言える。
・flex 用のサブクラスとして mx.core.FlexLoader があり、toString() メソッドが DisplayObjects の階層を表すようになっている。

flash.text.engine.TextLine
・display text 上に文字列を表示するためのオブジェクト。
・final クラスなので継承できないし、ユーザが直接 new することもできない。
・flash.text.engine 系のパッケージと関わらない限りは必要なさそう。

flash.display.Stage
・ブラウザ内なら flash の表示領域が Stage で、Airなら各 NativeWindow が Stage を持つ。

flash.display.Sprite
・UI 系の一般的なベースクラスで、MovieClip からtimelineを抜いたようなもの。