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


渲染

渲染这些小部件取决于您如何解释数据。从技术上讲,您可以尝试通过htmlwrapperhtmlText进行有限数量的 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>

然后我们可以实现两个类:它们具有预定义的属性SpinnerSlider事件监听器。

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 回答