FLASH, И ГОТОВО! Красивое меню-трансформер Iv (dembicki@narod.ru) Спецвыпуск Xakep, номер #027, стр. 027-066-6 Функция закрытия папки имеет аргумент folder_only, который нужен для предотвращения обсчета дерева за пределами папки. Это нам понадобится, чтобы дважды, трижды и так далее не обсчитывать позиции мувиков, когда этим занимается другая функция. Первый перебор мувиков (while) скрывает все мувики в папке. Второй перебор - только расставляет последовательно все оставшиеся мувики по оси _y. Если аргумент folder_only равен true, то второй перебор мувиков не выполняется. Но этот аргумент мы будем устанавливать true только из функции открытия папки, в этом случае обсчет остальных мувиков выполнит функция открытия папки. ФУНКЦИЯ ОТКРЫТИЯ ПАПКИ Три основных момента: два перебора мувиков, как и в предыдущей функции и примерно по той же логике, но первый перебор имеет проверку узла на то, не является ли он папкой и, если является, то не закрыта ли эта папка. Если папка открыта, то идет дальнейший обсчет, а если папка закрыта, то вызывается функция закрытия папки, причем с параметром для предотвращения дублирования просчетов позиций мувиклипов. Функция закрытия папки при вызове с true аргументом возвращает ID первого не обсчитанного узла. Это значение присваивается счетчику, и дальнейший обход начинается с этого узла по прежнему принципу. В общем, для этого дерева я сделал минимальный функционал, предоставив свободу для твоего творчества. Впрочем, если попытаться так же подробно описать полнофункциональное дерево, то журнала не хватит. ОБРАБОТКА НАПИЛЬНИКОМ Ты вполне можешь добавить самостоятельно навигацию по дереву при помощи стрелок клавиатуры, изменить дизайн иконок и тому подобное. Я бы рекомендовал добавить скроллер дерева - это несложно, поскольку все дерево находится в одном мувиклипе. Но перед этим сделаем еще одно: подготовим к публикации. Поскольку предполагается, что это меню будет в отдельном фрейме и будет занимать его целиком, то есть мы установим его размеры 100% на 100%, то нам необходимо сделать так, чтобы ролик не ресайзился и нулевая точка координат не гуляла, где попало. Используем объект Stage: Stage.scaleMode = "noScale"; Stage.align = "TL"; Тестани. Менюха переместилась в верхний левый угол благодаря тому, что align установлен Top Left (TL). При изменении размеров размеры объектов не будут изменяться, мы это установили в scaleMode. Вкратце опишу, как ты можешь добавить скроллер. Создается слушатель события onResize, который при возникновении этого события получает информацию от объекта и выполняет назначенные ему действия. В коде ниже я схитрил - не стал создавать дополнительный объект-слушатель, а объединил функции вещателя и слушателя в объекте Stage. Теперь он сам слушает то, что сам говорит - печальная участь для представителя разговорного жанра %). Stage.onResize = function() { trace("w="+(Stage.width+4)+" h="+(Stage.height+4)); }; Stage.addListener(Stage); Теперь, зная высоту и ширину ролика, легко пересчитать координаты скроллера, определить - скрыть скроллер или отобразить, какая часть меню вышла за пределы ролика, рассчитать высоту лифта и так далее. |