从flash cs3中的xml文件创建动态导航

时间:2009-04-30 13:22:33

标签: xml flash actionscript-3

我想将一个xml文件交给swf并让swf为xml文件中的每个链接生成一个动态文本框和按钮

基本导航

这是xml

<?xml version="1.0" encoding="UTF-8"?>
    <page>
    <page name="Page Name 1" url="/page-1/" />
    <page name="Page Name 2" url="/page-2/" />
    <page name="Page Name 3" url="/page-3/" />
    <page name="Page Name 4" url="/page-4/" />
    </page>

在我的文章中,我的库中有一个名为'nav_button'的按钮

有一个名为actions的图层,在第1帧中我有这个

var xml:XML;
var xmlList:XMLList;
var xmlLoader:URLLoader = new URLLoader();

var button:Button = new Button();


xmlLoader.load(new URLRequest("links.xml"));

xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);

function xmlLoaded(event:Event):void
{
xml = XML(event.target.data);
xmlList = xml.children();
trace(xml.length());

for(var i:int = 0; i < xmlList.length(); i++)
{
    button = new Button();
    button.x = 25;
    button.y = i * 50 +25; 
    addChild(button);
}
}

xml导入正常,但是当涉及到for循环并将按钮和文本框添加到舞台时,我敬酒

2 个答案:

答案 0 :(得分:2)

您的xml文件无效。它只能包含一个根节点。

试试这个:

<?xml version="1.0" encoding="UTF-8"?>
<pages>
<page name="Page Name 1" url="/page-1/" />
<page name="Page Name 2" url="/page-2/" />
<page name="Page Name 3" url="/page-3/" />
<page name="Page Name 4" url="/page-4/" />
</pages>

这是您第一帧的代码:

var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
xmlLoader.load(new URLRequest("links.xml"));

function xmlLoaded(event:Event):void {
    var pages:XML = new XML(event.target.data);
    var i:int = 0;
    for each (var page:XML in pages.page) {
        var button:LinkButton = new LinkButton();
        button.x = 25;
        button.y = i * 50 + 25; 
        button.label = page.attribute("name");
        button.url = page.attribute("url");
        addChild(button);
        trace(i++);
    }
}

你需要一个自定义按钮类:

package {
    import fl.controls.Button;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.net.navigateToURL;

    public class LinkButton extends fl.controls.Button {
        public var url:String;
        public function LinkButton(){
            super();
            this.addEventListener(MouseEvent.CLICK, clickHandler);
        }
        private function clickHandler(mouseEvent:MouseEvent) {
            flash.net.navigateToURL(new URLRequest(url), "_blank");
        }
    }
}

也许我需要更详细地解释一下:

  1. 创建一个新的Flash文件( Ctrl-N
  2. 打开“组件”面板( Ctrl-F7
  3. 打开“库”面板( Ctrl-L
  4. 拖动组件&gt;用户界面&gt;按钮到库
  5. 选择第一帧
  6. 打开操作面板( F9
  7. 粘贴第一段代码
  8. 保存文件( Ctrl-S
  9. 创建一个新的ActionScript文件( Ctrl-N
  10. 粘贴第二位代码
  11. 将文件保存在与“LinkBut​​ton.as”相同的文件夹中( Ctrl-S
  12. 返回电影( Ctrl-Tab
  13. 测试影片( Ctrl-Enter
  14. 我强烈建议你再接受一些培训。 Lee Brimelows site是一个很好的起点。

答案 1 :(得分:1)

我意识到这已经过时了,但今天对我来说是新的。

我不明白你为什么要创建一个自定义按钮类。我认为没有必要完成你想要做的事情。

function xmlLoaded(event:Event):void {
    var pages:XML = new XML(event.target.data);
    var i:int = 0;
    for each (var page:XML in pages.page) {
        var button:LinkButton = new LinkButton();
        button.x = 25;
        button.y = i * 50 + 25; 
        button.label = page.attribute("name");
        button.url = page.attribute("url");
        addChild(button);
        trace(i++);
    }
}

上面的函数尽管很好,但为什么不在for循环中添加事件监听器呢?添加以下行:

button.addEventListener(MouseEvent.CLICK, gotoURL);
在for循环中

,然后添加函数:

function gotoURL(e:MouseEvent):void
{
    navigateToURL(new URLRequest(e.target.url));
}

这将消除创建外部文件和自定义类的需要。