создать динамическую навигацию из XML-файла во Flash CS3 - PullRequest
0 голосов
/ 30 апреля 2009

Я хочу передать XML-файл 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 ]

2 голосов
/ 30 апреля 2009

Ваш 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. перетащите Компоненты> Пользовательский интерфейс> Кнопка в библиотеку
  5. Выберите первый кадр
  6. открыть панель действий ( F9 )
  7. вставьте сюда первый бит кода
  8. Сохранить файл ( Ctrl-S )
  9. создать новый файл ActionScript ( Ctrl-N )
  10. вставьте второй бит кода сюда
  11. Сохраните ваш файл в той же папке, что и «LinkButton.as» ( Ctrl-S )
  12. Вернитесь к своему фильму ( Ctrl-Tab )
  13. проверить фильм ( Ctrl-Enter )

Я настоятельно рекомендую вам пройти дополнительное обучение. Сайт Lee Brimelows - хорошее место для начала.

1 голос
/ 11 марта 2011

Я понимаю, что это старо, но сегодня оно было для меня новым.

Я не понимаю, почему вы хотите создать пользовательский класс кнопок. Я не думаю, что необходимо выполнить то, что вы пытались сделать.

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));
}

Это исключит необходимость создания внешних файлов и пользовательских классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...