Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   XML меню аккордеон (http://www.flasher.ru/forum/showthread.php?t=157636)

mooncar 10.06.2011 12:18

Для вышеприведенного XML загрузка и парсинг:
Код AS1/AS2:

var configXmlPath:String = '';//URL конфигурационного XML
var xmlData:XML = new XML();
xmlData.ignoreWhite = true;
xmlData.onLoad = loadXML;
xmlData.load(configXmlPath);
 
function loadXML (success:Boolean)
{
        if (success)
        {
                var xmlNode:XMLNode = this.firstChild ; //для сокращения записи
                var amountMenu:Number = xmlNode.childNodes.length ;
 
                for (i = 0; i < amountMenu; i++)
                {
                        var menuId:Number = parseInt(xmlNode.childNodes[i].attributes['id']);
                        var menuName:Number = xmlNode.childNodes[i].attributes['name'];
 
                        var amountSubmenu:Number = xmlNode.childNodes[i].childNodes.length ;
 
                        for (j = 0; j < amountSubmenu; j++)
                        {
                                var submenuId:Number = parseInt(xmlNode.childNodes[i].childNodes[j].attributes['id']);
                                var submenuName:Number = xmlNode.childNodes[i].childNodes[j].attributes['name'];                               
                        }
                }
        }
}

1. Получение атрибутов url уж сами по аналогии.
2. Что и когда делать с полученными данными - тоже на ваше усмотрение: можно в цикле загонять в многомерные массивы для последующего использования (правда это тоже избыточно, ведь экземпляр XML с полученными данными - это тоже своего рода массив, по ходу прямо его и использовать), а можно тут же и использовать даннные, в процессе парсинга.
3. parseInt для id - ну это чтобы как-то вычислять можно было, например, или для удобства создания и использования многомерного массива, чтобы по номерным индексам обращаться к элементам, причем эти индексы были бы равны id. Факультативно, можете убрать это приведение к числу.
4. Запись вида attributes['name'] - я так привык просто, строковое имя атрибута выделяется лучше в редакторе кода.

vivado 14.06.2011 14:29

Всем привет. Спасибо за помощь. Благодаря вам кое что начинает получаться.

Код AS1/AS2:

xn=162; //Начальные координаты меню по X
yn=210; //Начальные координаты меню по Y
xrast=78; //расстояние между пунктами меню по X
yrast=15; ////расстояние между пунктами меню по Y
 
var configXmlPath:String = 'menu_horizontal.xml';//URL конфигурационного XML
var xmlData:XML = new XML(); //Создаем переменную
xmlData.ignoreWhite = true;
xmlData.onLoad = loadXML;
xmlData.load(configXmlPath);
 
function loadXML (success:Boolean){
        if (success){
                var xmlNode:XMLNode = this.firstChild ; //для сокращения записи
 
                //Переменная колличества пунктов меню
                var amountMenu:Number = xmlNode.childNodes.length;
 
                for (i = 0; i < amountMenu; i++){
                        //Считываем ID для подменю
                        var MenuId:Number = parseInt(xmlNode.childNodes[i].attributes['id']);
                        //Считываем Url для меню
                        var MenuUrl:Number = xmlNode.childNodes[i].attributes['url'];
                        //Считываем Имя для меню
                        var MenuName:Number = xmlNode.childNodes[i].attributes['name'];
                          //Прикрепляем мувик Меню из библиотеки
                        _root.attachMovie("Menu","Menu"+MenuId,MenuId);
                        //Задаем координаты по x и y для мувика
                        _root["Menu"+MenuId]._x = xn+xrast*MenuId;
                        _root["Menu"+MenuId]._y = yn;
                      //Загружаем переменные Имя Меню и Url
                        _root["Menu"+MenuId].txt_menu = MenuName;
                        _root["Menu"+MenuId].url_menu = MenuUrl;
 
                                //Переменная колличества пунктов подменю
                                var amountSubmenu:Number = xmlNode.childNodes[i].childNodes.length;
 
                                for (j = 0; j < amountSubmenu; j++)        {
                                //Считываем ID для подменю
                                var SubmenuId:Number = parseInt(xmlNode.childNodes[i].childNodes[j].attributes['id']);
                                //Считываем Url для подменю
                                var SubmenuUrl:Number = xmlNode.childNodes[i].childNodes[j].attributes['url'];
                                //Считываем Имя для подменю
                                var SubmenuName:Number = xmlNode.childNodes[i].childNodes[j].attributes['name'];
                                //Прикрепляем мувик Подменю из библиотеки
                                _root["Menu"+MenuId].attachMovie("SubMenu","SubMenu"+SubmenuId,SubmenuId);
                                //Задаем координаты по x и y для мувика
                                _root["Menu"+MenuId]["SubMenu"+SubmenuId]._x = 0;
                                _root["Menu"+MenuId]["SubMenu"+SubmenuId]._y = _root["Menu"+MenuId]._y/yn+15+yrast*SubmenuId;
                                //Загружаем переменные Имя Подменю и Url
                                _root["Menu"+MenuId]["SubMenu"+SubmenuId].url_submenu = SubmenuUrl;
                                _root["Menu"+MenuId]["SubMenu"+SubmenuId].txt_submenu = SubmenuName;
                        }
                }
        }
}

Меню распарсинговано и приаттачено, теперь хочу сделать чтоб соответствующие пункты подменю раскрывались и скрывалось при подводе мыши к основным пунктам меню. Хочу спросить совета, как лучше это сделать.

Думаю сделать это так.
Способ 1. Аттачить мувики Подменюшек в отдельный мувик (например в какой-нибудь listSubMenu) расположенный в мувике пунктов Меню, который по умолчанию будет скрыт (_visible=false) а потом на пункт Меню повесить:
Код AS1/AS2:

onRelease = function() {
listSubMenu._visible=true.
}

Способ 2. Писать условие для каждого из главных пунктов меню, чтото типа
Код AS1/AS2:

 if (MenuId=="0"){
_root["Menu"+MenuId].onRollOver = function() {
listSubMenu.gotoAndPress(1); //отображаем подменю для Меню 0
};
 if (MenuId=="1"){
_root["Menu"+MenuId].onRollOver = function() {
listSubMenu.gotoAndPress(2); //отображаем подменю для Меню 1
};
 
//и т.д.

Подскажите как будет правильнее.
Вот ссылка на текущий исходник.menu

dark256 14.06.2011 15:32

Спрашивать "как лучше" - не имеет ровно никакого смысла. Ибо вам тут сейчас предложат 100 вариантов и вы утонете во вводных.
Надо просто сесть и делать. На это может уйти час, день, неделя, месяц.
В любом случае чужой опыт Вам не пригодится.
Каждый сам, лично должен наступить на все грабли, чтобы ориентироваться в процессе в дальнейшем.

vivado 14.06.2011 16:01

Цитата:

Сообщение от dark256 (Сообщение 1003651)
Спрашивать "как лучше" - не имеет ровно никакого смысла. Ибо вам тут сейчас предложат 100 вариантов и вы утонете во вводных.
Надо просто сесть и делать. На это может уйти час, день, неделя, месяц.
В любом случае чужой опыт Вам не пригодится.
Каждый сам, лично должен наступить на все грабли, чтобы ориентироваться в процессе в дальнейшем.

Используя предложенные грабли и понабив шишек кое как написал код для правильного отображения/скрытия подпунктов меню. Единственное, что меня огорчает я так и не смог написать весь код в одном кадре, пришлось ставить код на мувики, ну никак не хотел он работать иначе ((( Ну это небольшое отступление от темы.

Задача 1 решена, меню парсится из xml и все данные грузятся. Приступил к тому о чем собственно тема, к созданию вертикального разъезжающегося меню (а ля аккордеон). Мучаюсь над написанием функции которая будет "раздвигать" менюшки. Сново взываю о помощи )))

Итак я вижу это так в функцию должны передаваться
1. Имя "активного" меню
2. Кол-во пунктов подменю этого меню (чтоб знать на сколько опустить/поднять ниже расположенные пункты меню

Добавлено через 23 часа 23 минуты
Сломал мозг слегка но что то родилось, правда опять как то криво работает (((
Код AS1/AS2:

function SlideMenu(NumSelectedMenu,NumPodmenu){ //Раздвигает пункты меню
NumPodmenu=NumPodmenu/3; //Так надо не обращайте внимания )))
 
trace("Номер выбранного меню "+NumSelectedMenu+" в нем подменю "+NumPodmenu+" Всего пунктов меню "+PunktovMenuVsego);
hpodmenu=20; //высота пункта подменю
 
if (NumSelectedMenu<PunktovMenuVsego){ //Если Номер выбранной менюшки меньше чем всего менюшек
        MoveMenuStart = NumSelectedMenu; //Первое меню под активным
        _root["Menu"+MoveMenuStart]._y=NumPodmenu*hpodmenu; //Сдвигаем вниз первое меню под активным
        trace ("Опускаем Menu "+MoveMenuStart);
}
OtherDownMenu=MoveMenuStart+1;
for ( r = OtherDownMenu; OtherDownMenu<PunktovMenuVsego; r++){
        //Опускаем остальные менюшки
        i++;
        _root["Menu"+r]._y=_root["Menu"+MoveMenuStart]._y+hpodmenu*i;
        trace ("Опускаем Menu "+OtherDownMenu);
        OtherDownMenu++; //к следующей менюшке
 
}
}

Гляньте что не так пожааалуста...
Вот исходник Меню

Nina 15.06.2011 16:11

А зачем вводить переменную?
Код AS1/AS2:

MoveMenuStart = NumSelectedMenu; //Первое меню под активным


vivado 16.06.2011 13:03

Цитата:

Сообщение от Nina (Сообщение 1003894)
А зачем вводить переменную?
Код AS1/AS2:

MoveMenuStart = NumSelectedMenu; //Первое меню под активным


Ну да чето я лишнего понаписал )))
Вот так будет лучше.

Код AS1/AS2:

function SlideMenu(NumSelectedMenu,NumPodmenu){ //Раздвигает пункты меню
NumPodmenu=NumPodmenu/3; //Так надо не обращайте внимания )))
 
trace("Номер выбранного меню "+NumSelectedMenu+" в нем подменю "+NumPodmenu+" Всего пунктов меню "+PunktovMenuVsego);
hpodmenu=23; //высота пункта подменю
 
MoveMenuStart = NumSelectedMenu+1; //Первое меню под активным
//OtherDownMenu=MoveMenuStart+1;
for ( r = MoveMenuStart; r<PunktovMenuVsego; r++){
        //Опускаем остальные менюшки
        _root["Menu"+r]._y=_root["Menu"+NumSelectedMenu]._y+hpodmenu*i;
        trace ("Опускаем Menu "+r);
        i++;
}
}

Теперь нужно придумать как обратно менюшки возвращать при отведении мышки. Наверное нужно переменную для предыдущей активной менюшки ввести и отслеживать ее координаты. Блин как все запущено (((

Добавлено через 2 часа 19 минут
УРА У МЕНЯ ВСЕ ПОЛУЧИЛОСЬ!
Вертикальное и горизонтальное XML меню на AS 2.0 готово!
МОжет конечно код кривоват + кое-где он размещен на мувиках (знаю, знаю, что это плохо,
но не смог сделать по другому) но в конце концов все работает и я счастлив )))
Выкладываю работающие исходники, может кому пригодится.

Горизонтальное и вертикальное XML меню


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

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