0

私の仕事では、Java Flash Web アプリケーションに取り組んでおり、バックエンド システムは Web サービスを介して XML を UI に送信します。Web サービスは顧客のレイアウトを XML でフロントエンドに送信し、UI はレイアウト XML で提供されたウィジェット ID に基づいてウィジェットをレンダリングします。XML の例は次のとおりです。

<layout>
<widget name="Scheduler Widget" widgetId="17ca7746-efbe-11e2-986e-e73d14d17dba">
<widget name="Scheduler Calendar" widgetId="5bcf13a0-efde-11e2-b031-bb52e5b1d05c">
<widget name="Scheduler Calendar Picker" widgetId="e1a430a4-eff3-11e2-8e64-4336a0ae0273">
<attribute name="file" value="picker.swf"/>
</widget>
<attribute name="file" value="calendar.swf"/>
<attribute name="name" value="cal name"/>
</widget>
<attribute name="file" value="scheduler.swf"/>
</widget>
<widget name="Report Widget" widgetId="3a3cb820-efbe-11e2-93df-dbecb33fa407">
<attribute name="name" value="test"/>
<attribute name="file" value="report.swf"/>
</widget>
</layout>

Flash には、file という名前の属性を取得して、その swf ファイルをレンダリングする機能がありますか? また、そのウィジェットに色、サイズ、位置などの属性がさらにある場合、Flash はそれらの属性をその swf ファイルに使用できますか?

これらの質問に加えて、誰かがこれを実装する方法の例を提供できますか? 私は Flash 開発者ではありません。他の人のためにこれを調査しているだけです。Flash には動的な機能があることを説明するこれを見つけました。

Flash で動的 UI ウィンドウを描画しますか?

4

1 に答える 1

2

確実に。

XML の読み取り

var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("ui.xml"));
myLoader.addEventListener(Event.COMPLETE, processXML);

function processXML(e:Event):void {
    var xml:XML = new XML(e.target.data);
    trace(xml.layout.widget[2].attribute.@value); // traces "picker.swf"
}

xml オブジェクトの読み取りは、dot.notation、bracket[indexes] を利用する他の階層の読み取りとよく似ていますが、ノードのプロパティにアクセスするための @attribute 識別子が追加されています。また、(一般的に)識別するだけxml.layout.widgetで、実際にはウィジェットのすべてのインスタンスとその内容が文字列として返されるため、少し奇妙です。

完全なドキュメントについては、次をお読みください。

コード共和国: AS3 XML

Adobe Actionscript 3 リファレンス: XML


レンダリング

これらのウィジェットのレンダリングは、データをどのように解釈するかの問題です。技術的には、 htmlwrapperまたはhtmlTextを介して制限された量の HTML レンダリングを試すこともできますが、そのようにしたいとは思わないでしょう。多くの場合、Flash でウィジェットの独自の表現を作成し、XML でそれらのウィジェットの一般的な逸脱を定義します。

次の XML を検討してください。

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <widget
        kind="Spinner"
        name="Alpha"
        color="0xFF0000"
        x="100"
        y="100"
        width="50"
        height="50"
        file="foo.jpg" />
    <widget
        kind="Slider"
        name="Beta"
        color="0x0000FF"
        file="bar.swf" />
</layout>

次に、定義済みのプロパティとイベント リスナーを持つSpinnerとの 2 つのクラスを実装できます。Slider

package {
    import flash.display.*;

    public class Spinner extends Sprite {
        private var defaults:Object = {
            "x":10,
            "y":10,
            "width":50,
            "height":50,
            "color":0x000000
        };



        public function Spinner(settings:Object = null) {
            // Store the settings passed for any present defaults
            for (var attribute:String in settings) {
                if (defaults.hasOwnProperty(attribute)) {
                    defaults[attribute] = settings[attribute];
                }
            }

            // Update the appearance to match the settings.
            with (defaults) {
                graphics.beginFill(color, 1);
                graphics.drawRect(x, y, width, height);
                graphics.endFill();
            }

            if (settings.hasOwnProperty("name")) {
                this.name = settings.name
            }
        }
    }
}

XML を読み取るときは、各ノードを調べて、そのノードの属性を取得し、それをクラス コンストラクターに適用します...

function processXML(e:Event):void {
    var layout:XML = new XML(e.target.data);

    for each (var widget:Object in layout) {
        switch (widget.kind) {
            case "Spinner":
                addChild(new Spinner(widget))
                break;
            case "Slider":
                addChild(new Slider(widget))
                break;
        }
    }
}

免責事項: この方法で xml ノードにアクセスすることは、おそらく正しくありません。疑似コードと考えてください。私は常にxmlをネストされたオブジェクト/配列階層として使用する前にサニタイズするので、少し練習不足です。

簡単に言えば、XML はオブジェクトの外観を指示しますが、Actionscript はそれらのオブジェクトが何であるか、いつ、どのように画面に追加するかを指示します。

于 2013-07-23T15:00:26.517 に答える