В этом уроке будем учиться создавать продвинутое XML меню. Для выполнения этого урока нам понадобится библиотека TweenMax
Подготовка:
1. Создадим *.fla документ размером 400х350.
2. Создадим элемент меню. Нарисуем квадрат размером 40х40. Сконвертируем квадрат в мувиклип и дадим ему имя "menuItem". Зададим точку регистрации в левом верхнем углу.
3. Внутри мувиклипа на новом слое добавим динамическое текстовое поле по центру мувиклипа. Зададим выравнивание текста по центру. Напишем в текстовом поле что-нибудь, например, "1".
4. Встроим шрифт числовых символов.
5. В свойствах текстового поля зададим имя "menuItem".
6. Привяжем наш мувиклип к классу "MainItem".
7. Удалим мувиклип со сцены. Он останется у нас в библиотеке. Работать с ним мы будем с помощью скрипта.
XML файл:
8. Открываем блокнот и пишем в нем следующий код:
<?xml version="1.0" encoding="utf-8"?>
<menus>
<menu id="1">
<item>1.1</item>
<item>1.2</item>
</menu>
<menu id="2">
<item>2.1</item>
<item>2.2</item>
<item>2.3</item>
<item>2.4</item>
</menu>
<menu id="3">
<item>3.1</item>
<item>3.2</item>
<item>3.3</item>
<item>3.4</item>
</menu>
<menu id="4">
<item>4.1</item>
<item>4.2</item>
<item>4.3</item>
</menu>
</menus>
9. Сохраняем текстовый файл рядом с *.fla файлом под именем "flash_menu.xml".
Пишем скрипт:
10. В первом кадре таймлайна пишем следующий код:
//Импортируем ТвинМакс для анимации.
import com.greensock.*;
import com.greensock.easing.*;
import com.greensock.plugins.*;
TweenPlugin.activate([GlowFilterPlugin]);
//Сохраняем высоту элемента меню в константе.
const ITEM_HEIGHT:Number = 40;
//Сохраняем путь до XML файла.
var xmlPath:String = "flash_menu.xml";
//The XML data will be inserted into this variable
var xml:XML;
//Задаем расположение меню по Y.
var floor:Number = 280;
//Здесь будет храниться массив текущего выбранного меню.
var selectedMenu:Array;
//Здесб будет храниться чисто созданных меню.
var menuCounter:uint = 0;
// Загружаем XML файл.
var loader = new URLLoader();
loader.load(new URLRequest(xmlPath));
loader.addEventListener(Event.COMPLETE, xmlLoaded);
//Эта функция вызывается, когда XML файл полностью загружен.
function xmlLoaded(e:Event):void {
//Убедимся, что мы не работаем с нулевым загрузчиком.
if ((e.target as URLLoader) != null ) {
//Поместим загруженные данные в XML переменную.
xml = new XML(loader.data);
//Вызываем функцию, которая создает все меню.
createMenus();
}
}
//Эта функция создаем все меню.
function createMenus():void {
//Цикл ищет список меню в XML файле
for each (var menu:XML in xml.menu) {
//Мы создаем пункт меню каждый раз, как цикл находит пункт меню в XML файле.
//Мы отправляем "menu" данные xml как параметр функции создания меню..
var menuItems:Array = createMenu(menu);
//Расставляем элементы меню, которые находятся у нас в массиве.
for (var i= 0; i< menuItems.length; i++) {
//Задаем координаты.
menuItems[i].y = floor;
menuItems[i].x = -30 + menuCounter * 80;
//Добавляем в список отображения.
addChild(menuItems[i]);
}
}
}
//Эта функция создает один подпункт меню.
function createMenu(menu:XML):Array {
//Создаем массив, который содержит все подпункты одного меню.
var menuItems:Array = new Array();
//Цикл ищет все подпункты одного меню.
for each (var item:XML in menu.item) {
//Создает новый подпункт меню.
var menuItem:MenuItem = new MenuItem();
//Задает текст подпункта меню.
menuItem.menuText.text = item.toString();
//Отключаем реакцию потомков мувиклипа на мышь.
menuItem.mouseChildren = false;
//Добавляем подпункт меню в массив.
menuItems.push(menuItem);
}
//Теперь создаем главный пункт меню.
var mainItem:MenuItem = new MenuItem();
//Отключаем реакцию потомков мувиклипа на мышь.
mainItem.mouseChildren = false;
//Добавляем главный пункт меню в массив.
menuItems.push(mainItem);
//Сохраняем массив, к которому принадлежит этот главный пункт меню.
//Это нам понадобиться для анимации.
mainItem.belongsToMenu = menuItems;
//Задаем id атрибут в качестве текста в пункте меню.
mainItem.menuText.text = menu. @ id;
//Назначаем слушатель события на главные пункты меню.
mainItem.addEventListener(MouseEvent.CLICK, mainItemClicked);
//Обновляем счетчик.
menuCounter++;
//Возвращаем массив, который содержит все элементы одного меню.
return menuItems;
}
//Эта функция вызывается, когда кликаем по пункту меню.
function mainItemClicked(e:Event):void {
//Анимируем предыдущее меню вниз (сворачиваем).
if (selectedMenu) {
for (var i =0; i< selectedMenu.length-1; i++) {
TweenMax.to(selectedMenu[i], 0.5 , {y:floor, glowFilter:{color:0x324df, alpha:0, blurX:0, blurY:0}});
}
}
//Узнаем, к какому меню принадлежит выбранный элемент.
var clickedMenu:Array = e.target.belongsToMenu;
//Делаем текущим выбранным меню тот, по которому мы кликнули.
selectedMenu = clickedMenu;
//Цикл проходит по элементам меню, кроме главного. Главный элемент не анимируется.
for (var j =0; j< selectedMenu.length-1; j++) {
//Сохраняем элемент в локальной переменной.
var item = selectedMenu[j];
//Расчитываем координаты анимации элемента.
var targetY:Number = floor - ITEM_HEIGHT*1.2*(1 + j);
//Анимируем элемент.
TweenMax.to(item, 0.5 , {y:targetY, glowFilter:{color:0xffffff, alpha:1, blurX:20, blurY:20}});
}
}
Готово. Напомню, если возникли какие-либо вопросы, то обращайтесь на форум.
Комментарии
В пунктах меню нужно поменять мувик на кнопку , иначе не появляется рука при наведении
6. Привяжем наш мувиклип к классу "MainItem".
а на скрине написано MenuItem =)))
В пунктах меню нужно поменять мувик на кнопку , иначе не появляется рука при наведении
Ничего менять не нужно. Достаточно задать мувиклипу свойство:
И появится рука при наведении.
а на скрине написано MenuItem =)))
Да. Чуток ошибся. Так что сверяйтесь с исходником. :)
True Love
Спасибо!! как раз то что мне нужно!!))
TweenMax платный? чего то не получается скачать...
TweenMax запакован в исходнике к уроку.) И он бесплатный.)))) И скачать его легко можно на их сайте. Вы просто не на те кнопки жмете на сайте. Будьте внимательнее. :)
True Love
спасибо, я просто английского не знаю(
Кто может посказать.
Как это меню из горизонтального в вертикальное превратить?