Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Выпадающий список (http://www.flasher.ru/forum/showthread.php?t=141181)

Universe 18.06.2010 02:23

Выпадающий список
 
Привет!Делаю выпадающий список и столкнулся с одной проблемкой! При отведении курсора от пункта меню подпункты должны исчезать...т.к. я всё делаю через xml у меня за создание всех подпунктов в каждом пункте отвечает одна и та же функция! Следовательно для того чтобы обновить кол-во текстовых полей и содержимое в них я повторно запускаю функцию создания полей и их заполнения через xml! Получается чтобы при этом не происходило наслоения старых пунктов на новые я должен каким то образом удалять старые пункты перед тем как создавать новые! Описываю структуру своих ссылок:
1. Есть мувик на сцене, в который будут помещаться ссылки(пока внутри тока фон)
2. Создаю программно спрайт в этом мувике в который и буду помещать мувики с текстом ссылок!(чтобы они все были в отдельном контейнере)
3. В созданный ранее контейнер помещаю ссылки при помощи for'a.
ну и т.д.
Получается чтобы очищать сцену от ранее созданных подпунктов я просто удаляю мувик контейнер(который я создавал на пункте 2). Он то вроде и удаляется, но почему-то кол-во мувиков в нём всёравно увеличивается! Подскажите, как правильно очищать подпункты со сцены и правлен ли вообще алгоритм создания в моём случае?Спасибо!
Прикрепляю весь код(он в некоторых местах не доделан - это касается загрузки самого xml в текстовые поля в цикле, но на суть вопроса и как я понимаю ответа это повлиять не должно)

Код AS3:

var xml:XML;
var mainLink_txt:TextField;
var subLinks_txt:TextField;
var mainLink_mc:Sprite;
var subLink_mc:Sprite;
var subLinkContainer_mc:Sprite = new Sprite();
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.load(new URLRequest("../xml/headerLinks.xml"));
 
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
 
function xmlLoaded(e:Event):void
{
        //trace(e.target.data);
        xml = XML(e.target.data);
        //trace(xml.top);
        placeMainLinks("top");
 
        placeMainLinks("bottom");
 
}
 
function clearSubLinks():void
{
                trace(subLinkContainer_mc.name);
                upSubLinks.removeChild(subLinkContainer_mc);
 
}
 
subLinkContainer_mc.x = 100;
var myFormat:TextFormat = new TextFormat();
                myFormat.font = "Verdana";
                myFormat.size = 12;
                myFormat.color = 0x000000;
                myFormat.italic = false;
                myFormat.bold = true;
                myFormat.align = TextFormatAlign.JUSTIFY;
 
upSubLinks.visible = false;
downSubLinks.visible = false;
function placeMainLinks(level:String):void
{
        var xmlLevel:XMLList;
        var linkHolder:MovieClip;
 
        if(level == "top")
        {
                xmlLevel = xml.topLinks.link;
                linkHolder = upMainLinks;
                //trace(xmlLevel.length())
        }
        else if(level == "bottom")
        {
                xmlLevel = xml.bottomLinks.link;
                linkHolder = downMainLinks;
        }
        for(var i:uint; i< xmlLevel.length(); i++)
        {
                mainLink_txt =  new TextField();
                mainLink_mc = new Sprite();
                mainLink_txt.text = "works";
                mainLink_txt.setTextFormat(myFormat);
                mainLink_txt.selectable = false;
                mainLink_txt.autoSize = TextFieldAutoSize.LEFT;
                mainLink_txt.antiAliasType = flash.text.AntiAliasType.NORMAL;
                mainLink_txt.embedFonts = true;
                mainLink_txt.border = true;
                mainLink_mc.buttonMode = true;
                mainLink_mc.addChild(mainLink_txt);
                linkHolder.addChild(mainLink_mc);
                mainLink_mc.x = i * 50;
                mainLink_mc.addEventListener(MouseEvent.ROLL_OVER, rollMainLink);
        }
}
 
function placeSubLinks(level:String):void
{
        var  xmlLevel:XMLList;
        var linkHolder:MovieClip;
        if(level == "top")
        {
                xmlLevel = xml.bottomLinks.link;
                linkHolder = upSubLinks;
                //trace(xmlLevel.length())
        }
        else if(level == "bottom")
        {
                xmlLevel = xml.bottomLinks.link;
                linkHolder = downSubLinks;
        }
        for(var i:uint; i< xmlLevel.length(); i++)
        {
                subLinks_txt =  new TextField();
                subLink_mc = new Sprite();
                subLinks_txt.text = "works";
                subLinks_txt.setTextFormat(myFormat);
                subLinks_txt.selectable = false;
                subLinks_txt.autoSize = TextFieldAutoSize.LEFT;
                subLinks_txt.antiAliasType = flash.text.AntiAliasType.NORMAL;
                subLinks_txt.embedFonts = true;
                subLinks_txt.border = true;
                subLink_mc.buttonMode = true;
                subLink_mc.addChild(subLinks_txt);
                subLink_mc.name = "subLink" + i;
                subLinkContainer_mc.addChild(subLink_mc);
                subLinkContainer_mc.name = "linksContainer";
                linkHolder.addChild(subLinkContainer_mc);
                if(i%2 == 0)
                {
                        subLink_mc.y = 0;
                        subLink_mc.x = i * 25;
                }
                else
                {
                        subLink_mc.y = 15;
                        subLink_mc.x = (i-1) * 25;
                }
 
        }
}
 
function rollMainLink(e:MouseEvent):void
{
 
        if(e.target.parent.name == "upMainLinks")
        {
                upSubLinks.visible = true;
                placeSubLinks("top");
        }
        else if(e.target.parent.name == "downMainLinks")
        {
                downSubLinks.visible = true;
                placeSubLinks("bottom");
        }
        subLinkContainer_mc.x = e.target.x;
        e.target.addEventListener(MouseEvent.ROLL_OUT, rollOutMainLink);
 
}
 
function rollOutMainLink(e:MouseEvent):void
{
 
        if(e.target.parent.name == "upMainLinks")
        {
                //upSubLinks.visible = false;
                trace(subLinkContainer_mc.numChildren);
                clearSubLinks();
        }
        else if(e.target.parent.name == "downMainLinks")
        {
                downSubLinks.visible = false;
        }
}


Mur4ik 18.06.2010 05:35

Цитата:

Сообщение от Universe (Сообщение 916407)
Получается чтобы очищать сцену от ранее созданных подпунктов я просто удаляю мувик контейнер(который я создавал на пункте 2).

При удалении отображаемого объекта со сцены его содержимое не очищается автоматически.

Похоже что Вы удаляете subLinkContainer_mc просто со сцены, но не очищаете его содержимое, а т.к создается он у Вас один раз, то следственно постоянно накапливает в себе то что Вы в него добавляете при каждом открытии меню.

Т.е. либо удаляйте и создавайте subLinkContainer_mc каждый раз при необходимости, либо очищайте его содержимое.

P.S. А еще проще прятать/показывать этот контейнер в зависимости от поведения мыши и не перестраивать постоянно элементы списка. Но это при условии что пункты меню неизменны.

Universe 18.06.2010 19:23

в том то и дело, что у меня 5 пунктов, со своими подпунктами и содержимое в подпунктах, а также их кол-во меняется в зависимости от того на какой пункт я навожу мышь!Так что просто менять висибл врядли получится!
А как subLinkContainer_mc удалить физически вместе со всеми его доченими элементами?

Mur4ik 19.06.2010 14:13

Можно просто очищать его содержимое
Код AS3:

while (subLinkContainer_mc.numChildren) subLinkContainer_mc.removeChildAt(0);

Ну и если в subLinkContainer_mc содержатся элементы к которым привязаны слушатели, то тоже не забываем их очищать.


Часовой пояс GMT +4, время: 03:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.