Уроки Flash: Создание простого флеш-сайта

Источник: demiart
Stasan

Приветствую всех. Урок посвящен созданию простого флеш сайта средствами АС 3.0. Пример того что можно получить, находится ниже. В этом уроке внешний вид не принципиален основной упор на код. Дизайн - вещь которую всегда можно изменить. Урок расчитан на людей уже имеющих определенный опыт во флеш.


Приступим, для начало желательно создайте у себя на компьютере отдельную папку под этот проект.
Это не прихоть, просто вам самим так будет удобней.

Откройте флеш(в моем случае это Adobe Flash CS 3, напоминаю, что третья версия языка АС, доступна лишь начиная с него, если у вас версия младше, то могу только посоветовать обновиться). Создаем новый документ(Flash File(Action Script 3.0)). После создания сразу открываем панель Properties(Ctrl+F3), настраиваем размеры сцены в зависимости от ваших потребностей. В моем случае это 700 на 500. И меняем fps(скорость кадров), я обычно ставлю 31, сколько ставить вам - это ваш выбор, но стандартных 12 однозначно мало. Изобразите задний фон вашего сайта, основные элементы дизайна.

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

Создаем символ кнопки, имя butt, включаем Linkage. на первом слое размещаем основу кнопки, на
втором динамическое текстовое поле с Instance Name - ide. Делаем анимацию, этих элементов. При
анимировании текста, не допускайте его конвертирования в графический символ, анимируйте именно текстовое поле. Содержимое клипа выравнивайте по центру по горизонтали и вертикали.

Создаем символ маркера, имя marker, включаем Linkage. В нем изображаем какую-нибудь
полу-прозрачную фигуру, размером примерно с кнопку. Опять же выравниваем целиком по центру.

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

Создаем символ ползунка под скролбар, имя scroll_Drag, включаем Linkage. В нем небольшая
вертикальная линия, выравнивание такое же как и у предыдущего символа. В символе два кадра на первом кадре ползунок, в обычном состоянии, на втором когда он нажат.

Создание простого флеш-сайта

Когда мы закончили с настройкой сцены, можно двигаться дальше. Сохраните получившийся результат в подготовленную папку, имя файла - на ваше усмотрение. После сохранения, рядом с получившимся файлом создайте папку с именем "complex". В этой папке будет храниться пакет классов который мы с вами создадим. За одно рядом с нашим файлом можете создать еще две папки - "content" и "pics". И два текстовых файла - один переименуйте в "example.css", а второй файл в "structure.xml".

Возвращаемся во флеш. Создадим новый файл (ActionScript File), сохраним его в папку "complex" с
именем "mainFile.as". Вернемся к фла файлу проекта. Еще раз откроем панель Properties. В поле
Document class укажем "complex.mainFile".
Подготовочный этап окончен, можно приступать к программной части. Ее разбор начнется с xml.

Откройте файл structure.xml и разместите в нем такой вот фрагмент:

Code

<?xml version="1.0" encoding="UTF-8" ?>
<site>
<pages>
<page name="Обо мне" contName="content/1.txt"/>
<page name="Работы" contName="content/2.txt"/>
<page name="Переводы" contName="content/3.txt"/>
<page name="Контакты" contName="content/4.txt"/>
</pages>
</site>

Файл обязательно должен иметь кодировку UTF-8, пересохраните его выбрав эту кодировку. Этот файл по сути представляет из себя набор тегов <page> имеющих два параметра первый name - отвечает за название нашей "страницы", этот текст будет отображен на соответствующих пунктах меню. И второй параметр contName - это имя текстового файла из которого будет грузиться информация. Чтобы добавить новый пункт меню достаточно добавить рядом с остальными еще один тег <page> оформленный таким же образом.

Возвращаемся к файлу mainFile.as, разместим в нем следующий код. Это будет основной класс нашей программы, который по сути сформирует скелет сайта, оформит его внешний вид.

Code

package complex{/*Определяем принадлежность к пакету complex*/
import flash.display.*;/*Подключаем пакет для работы с дисплеем*/
import flash.ui.*;/*пакет содержащий классы необходимые для работы с мышью и клавиатурой*/
import flash.events.*;/*Подключение пакета контролирующего события, в духе нажатие мыши и т.д.*/
import flash.net.*;/*Этот пакет необходим для загрузки различной информации из вне*/
import flash.text.*;/*Пакет содержащий классы необходимые для работы с текстом*/

public class mainFile extends Sprite{/*Объявляем класс. Имя класс должно полностью совпадать с именем *.as файла*/
public var names:Array=[];/*Объявляем новый массив его мы будем использовать для хранения названий "страниц"*/
public var pages:Array=[];/*Этот массив будет хранить имена файлов с контентом*/
public var count:int = 0;/*Эта переменная будет в дальнейшем использоваться как счетчик пунктов меню*/

private var mainContent:TextField = new TextField();/*Объявляем новое текстовое поле, это будет наше основное поле для отображения контента*/

private var pageLabel:TextField = new TextField();/*Это текстовое поле будет использоваться для отображения названия текущей страницы вверху флешки*/
private var labelFormat:TextFormat = new TextFormat();/*Создаем новый объект типа Текст Формат, он будет использован для дальнейших настроек внешнего вида поля pageLabel*/

public var i:int;/*Целочисленная переменная будет использована в цикле в качестве параметра*/

public var scr_Line:Sprite = new scroll_line();/*Создаем новый Спрайт и присваиваем ему экземпляр содержимого библиотеки, это будет наша линия для скрола*/
public var scr_Drag:Sprite = new scroll_Drag();/*Еще один спрайт, это будет наш ползунок*/
public var check_Rectangle:Sprite = new Sprite();/*Вот маленькая хитрость, т.к. достучаться до сцены из других классов программы мне не удалось я создал этот Спрайт, в дальнейшем он будет использован в роли невидимой кнопки размером со сцену*/

public var myMarker:Sprite = new marker();/*Очередной Спрайт, это "бегающий" маркер, который будет отмечать пункт меню который открыт в данный момент*/

public var settingsXML:XML;/*Создаем новый xml объект в него будет загружаться структура нашего проекта*/
public var loader = new URLLoader();/*Создаем новый объект загрузчика, он будет использован для загрузки xml файла из вне*/

public function mainFile(){/*Новая функция, ее название совпадает с названием класса, это значит что она запустится автоматически при использовании класса*/

loader.load (new URLRequest("structure.xml"));/*Отдаем команду загрузить наш xml-файл*/
loader.addEventListener (Event.COMPLETE, xmlLoaded);/*Добавляем нового "слушателя" к нашему загрузчику, по окончанию загрузки xml файла будет вызвана функция xmlLoaded*/
}

function xmlLoaded (e:Event):void {/*Функция которая вызывается по окончанию загрузки xml*/

settingsXML = new XML(loader.data);/*Нашему ранее созданому xml-объекту присваиваем полученную загрузчиком xml структуру*/
settingsXML.ignoreWhitespace = true;/*Определяет необходимость игнорирования в тегах символа пробела*/

for each (var page:XML in settingsXML.pages.page) {/*Цикл производит повторения через узлы XML*/
names[count]=page.@name;/*Последовательно забиваем в массив имен атрибут узла XML, хранящий информацию о названии "страницы"*/
pages[count]=page.@contName;/*Последовательно забиваем в массив имен атрибут узла XML, хранящий информацию о имени файла с контентом*/
count++;/*Увеличиваем значаени заготовленной нами переменной для числа пунктов меню*/
}
createStage();/*Вызываем наиболее обширную функцию этого класса которая отвечает практически за формирование внешнего вида нашей флешки*/

}

public function createStage(){/*Функция формирующая внешний вид*/
/*Приступаем к созданию невидимой кнопки*/
check_Rectangle.graphics.beginFill(0xFFFFFF);/*Сперва установим заливку, цвет не принцпиален, т.к. кнопка все равно будет невидимой*/
check_Rectangle.graphics.drawRect(0,0,stage.width,stage.height);/*По сути вот он момент создания необходимой формы, внутри Спрайта создается прямоугольник с координатами 0,0 и размерами как у главной сцены*/
check_Rectangle.x=0;/*Изменяем координаты, кнопки по х=0*/
check_Rectangle.y=0;/*Изменяем координаты, кнопки по у=0*/
check_Rectangle.alpha=0;/*Делаем кнопку невидимой, параметр alpha а АС 3 в отличии от АС 2 имеет значения от 0 до 1, а не от 0 до 100, как было ранее*/
addChild(check_Rectangle);/*Добавляем невидимую кнопку на сцену*/

mainContent.width=360;/*Устанавливаем ширину в пикселях нашего текстового поля в котором будет отображен основной контент*/
mainContent.height=385;/*Устанавливаем высоту в пикселях нашего текстового поля в котором будет отображен основной контент*/
mainContent.x=310;/*Координата по x*/
mainContent.y=76;/*Координата по у*/
mainContent.multiline=true;
mainContent.wordWrap=true;/*Эти две строки делают так что текст нормально разбивается по строчкам*/
mainContent.border=true;/*Включаем рамку вокруг текстового поля*/
mainContent.borderColor=0x666666/*Устанавливаем цвет нашей рамки*/;
mainContent.selectable=false;/*Отключаем возможность выделения текста, если на вашем сайте будет какая-то информация которую пользователь может захотеть скопировать лучше так не делать, но для таких штучек как эта, параметр впринципе не критичен*/
addChild(mainContent);/*Теперь когда все настройки завершены добавляем на сцену, наше текстовое поле*/

addChild(scr_Line);/*Добавляем на сцену линию для скрола*/
addChild(scr_Drag);/*Добавляем на сцену ползунок*/

scr_Line.x=mainContent.x+mainContent.width+10;/*По оси x, располагаем нашу линию на 10 пикселей правее текстового поля*/
scr_Line.y=mainContent.y;/*По оси у, распологаем на одном уровне с текстовым полем*/
scr_Line.height=mainContent.height;/*Делаем линию той же высоты, что и текстовое поле*/

scr_Drag.x=mainContent.x+mainContent.width+10;
scr_Drag.y=mainContent.y;/*Координаты ползунку даем те же, что и большой линии*/

pageLabel.width=333;
pageLabel.height=45;
pageLabel.x=310;
pageLabel.y=14;
pageLabel.selectable=false;
/*Выше производятся настройки для текстового поля которое будет вверху и в котором будет отображаться название "страницы"*/
addChild(pageLabel);/*Добавляем это поле на сцену*/

/*Начинаем настройки текстового формата, для поля с названием*/
labelFormat.color=0x333333;/*Указываем цвет текста в нашем поле*/
labelFormat.size=35;/*Его размер*/
labelFormat.font="Bookman Old Style";/*Шрифт, обязательно передавать название в виде строки*/
labelFormat.bold=true;/*Включаем "жирность" текста*/
labelFormat.align="center";/*Выравнивание по центру*/

var myContentLoader:contentLoader = new contentLoader();/*Новый экземпляр класса отвечающего за загрузку, который мы напишем в дальнейшем*/
myContentLoader.loadInformation(mainContent,pages[i],"example.css",scr_Line,scr_Drag,check_Rectangle);/*Вызываем функцию этого класса которая просто произведет загрузку информации куда нам надо*/
/*В качестве параметров:
1. Куда загружать? В наше главное поле для контента.
2. Что загружать? Первую страницу, имя файла с контентом которой мы получили из xml, и затолкали в массив.
3. Имя файла содержащего настройки внешнего вида, указываем имя CSS файла.
4. Основа для скрола.
5. Ползунок для скрола.
6. Наша невидимая кнопка.
*/
pageLabel.text=names[0];/*Присваиваем названию страницы, соответствующее значение*/
pageLabel.setTextFormat(labelFormat);/*Устанавливаем названию форматирование текста настройки которого мы задали ранее*/

for(i=0;i<count;i++){/*Начинаем цикл перебираем значение от нуля, до числа элементов меню полученном ранее, по сути именно здесь начинается создание меню*/
var but:Sprite = new butt();/*Новый спрайт, ему присваиваем значение кнопки в библиотеке*/
addChild(but);/*Добавляем кнопку на сцену*/
but.x=150;/*Устанавливаем координату кнопки по х*/
but.y=40+but.height/2+(but.height+5)*i;/*Установка координаты по у, мы создаем первую кнопку на расстоянии 40 пикселей от верхнего края сцены, дальнейшие кнопки размещаются на расстоянии 10 пикселей друг от друга*/
var myAnimation:Animation = new Animation();/*новый экземпляр класса для анимации который мы создадим в дальнейшем*/
myAnimation.anim(but,names[i]);/*Вызываем функцию для линейной анимации при наведении, и обратной при убирании курсора*/
/*В качестве параметров:
1. Объект к которому цепляем класс, то есть наша кнопка.
2. Текст который будет отображен на кнопке. Необходимые тексты мы ранее получили из xml и перезалили в массив. Теперь просто ссылаемся на ячейку массива.
*/

var myButContentLoader:contentLoader = new contentLoader();/*Экземпляр класса для загрузки контента*/
myButContentLoader.loadInformationOnPress(but,mainContent,pages[i],"example.css",pageLabel,names[i],labelFormat,scr_Line,scr_Drag,check_Rectangle);
/*Вызывается функция для загрузки контента по нажатию на кнопку. По мимо тех параметров которые передавались для функции просто загрузки здесь еще передаются, Спрайт на который будут нажаимать. Поле для названия страницы, текст который в нем надо отобразить, и объект формата для этого поля.*/
var myMarkerTween:MarkerTween = new MarkerTween();/*Новый объект класса для передвижения маркера отмечающего текущую страницу в меню*/
myMarkerTween.moveMarker(but,myMarker,but.y,0.5);/*Вызываем функцию для перемещения*/
/*Параметры:
1. Кнопка на которую нажимаем.
2. Маркер который будем двигать.
3. Координата кнопки на которую нажали, конечная координата движения маркера.
4. Время движения маркера от текущего положения до, нажатой кнопки(в секундах)
*/
}
addChild(myMarker);/*Добавили на сцену маркер*/
myMarker.y=40+myMarker.height/2;
myMarker.x=150; /*Выровняли его координаты по координатам первой кнопки*/

}

}
}

Основной класс программы закончен, можно приступать к созданию остальных классов которые оживят наш скелет. Для начала создадим класс для анимации кнопок. Он будет размещать на кнопке указанный текст и производить линейную или обратную анимацию кнопки в зависимости от положения курсора относительно нее. Новый AS-файл, сохраняем в папку complex с именем "Animation.as". Содержимое этого класса.

Code


package complex{/*Определяем принадлежность к пакету complex*/
import flash.display.*;/*Подключаем пакет для работы с дисплеем*/
import flash.ui.*;/*пакет содержащий классы необходимые для работы с мышью и клавиатурой*/
import flash.events.*;/*Подключение пакета контролирующего события, в духе нажатие мыши и т.д.*/
 
public class Animation{/*Объявляем класс.*/
public var TF:int;/*Вводим новую переменную ее мы будем использовать для хранения кол-ва кадров в анимации данного символа*/
public var CF:int = 1;/*Вводим новую переменную ее мы будем использовать для хранения номера текущего кадра анимации*/
public var over:Boolean = false;/*Логическая переменная, ее будем использовать для того чтобы Функция производящая анимацию знала какое произошло событие*/
public var MenuLabel:String;/*Очередная переменная, на этот раз строка, ей мы передадим имя кнопки, которое было полученно при вызове класса*/
public function anim(but:Sprite,MLabe:String){/*Функция которая будет вызываться из основного класса, в ней мы добавим "слушателей" необходимых событий и присвоим полученное значение строки заранее заготовленной переменной*/

MenuLabel = MLabe;/*Присваиваем переменной полученное значение имени этого пункта меню*/

but.addEventListener(MouseEvent.MOUSE_OVER, roll);/*Добавляем "слушателя" который будет отслеживать наведение курсора на Спрайт и вызывать при этом функцию roll*/
but.addEventListener(MouseEvent.MOUSE_OUT, rollout);/*Добавляем "слушателя" который будет отслеживать убирание курсора с Спрайта и вызывать при этом функцию rollout*/
but.addEventListener(Event.ENTER_FRAME, render);/*Добавляем слушателя для того чтобы функция render выполнялась каждый кадр тем самым производя анимацию в случае необходимости*/
}
function roll(events:Event):void{/*Функция которая вызывается при наведении мыши на кнопку*/
over=true; /*Ранее созданая нами логическая переменная получает значение true, что свидетельствует о том, что надо производить линейную анимацию символа*/
}  

function rollout(events:Event){/*Функция которая вызывается при убирании мыши с кнопки*/
over=false; /*Ранее созданая нами логическая переменная получает значение false, что свидетельствует о том, что надо производить обратную анимацию символа*/
}

var firstTime:Boolean=false;/*Объявляем логическую переменную. Ее мы будем использовать в функции render, чтобы обеспечить однократное выполнение части ее содержимого*/
function render(events:Event){/*Функция которая выполняется каждый кадр*/
if(!firstTime){/*Проверяем значение логической переменной firstTime, если оно равно false, что значит, что содержимое этого условия еще не выполнялось, то программа переходит к выполнению команд внутри условного оператора*/
TF = events.target.totalFrames-1;/*Наша переменная для хранения кол-ва кадров получает значение кадров в анимации -1 кадр. Отнимаю один кадр т.к. у текстового поля также имеется своя анимация и естественно ключевой кадр на конце. Если анимация дойдет, до этого ключевого кадра, то содержимое текстового поля переопределится и затрется надпись с названием кнопки.*/
events.target.stop();/*Останавливаем воспроизведение анимации кнопки*/
events.target.ide.text=MenuLabel;/*Присваиваем текстовому полю расположенному в кнопке полученное при вызове основной функции значение*/
firstTime=true;/*Присваиваем логической переменной firstTime значение true, чтобы содержимое условного оператора не выполнялось больше в дальнейшем*/
}
if((over)&&(CF<TF)){/*Условный оператор, суть его примерно такова, если мышь наведена на кнопку и текущий кадр анимации не последний то,*/
CF++;/*Увеличиваем значение текущего кадра на 1*/
events.target.gotoAndStop(CF);/*и переходим к этому значению*/
}

if((!over)&&(CF>1)){/*Если мышь убрали и текущий кадр анимации не является первым*/
CF--; /*Уменьшаем значение текущего кадра на 1*/
events.target.gotoAndStop(CF);/*и переходим к этому значению*/
}
}

}
}

 

Оживили кнопочки, теперь надо бы создать класс используемый для загрузки контента из вне. Давайте определимся, как будет выглядеть этот контент. Для хранения информации я использую txt-файлы расоложенные в папке content. Флеш допускает использование минимального набора HTML-тегов к примеру тег <a>-гиперссылка, и очень важный для нас тег <img>-он позволит нам загружать изображения в текстовое поле. Я храню изображения в папке pics, путь к изображениям пишется относительно флешки. К примеру вот так выглядит в txt-файле, вторая страница в моем случае:

Code

 

<span class='mainFormat'><h1>Примеры работ:</h1>
<p><h2>Пример 1.</h2></p><p><img src="pics/pizza.jpg" align="right"/>Игра "Собери пиццу", сделана
в команде с замечательным человеком - Gal4onok.</p><p><a
href="http://www.free-lance.ru/users/Stasan/viewproj.php?prjid=1303848">Посмотреть работу</a></p>
<p><h2>Пример 2.</h2></p><p><img src="pics/summit.jpg" align="right"/>Шапка для сайта ночного
клуба. Функционируюет с ипользованием xml и взаимодействиванием с HTML.</p><p><a
href="http://www.free-lance.ru/users/Stasan/viewproj.php?prjid=1242128">Посмотреть
работу</a></p></span>

Для настройки внешнего вида текста я использую Каскадные таблицы стилей, в народе CSS. Вот такой вид должен иметь созданный нами ранее файл example.css

Code

.mainFormat {
font-family: Comic Sans MS;
font-size: 20;
color:#333333;
}
h1 {
font-family: Georgia;
font-size: 22;

}
h2 {
font-family: Georgia;
font-size: 20;

}
a:link {
color:#E37302;
font-size: 17;
text-decoration:underline;
}

Что же приступим к созданию класса для загрузки всей этой радости во флеш. Новый AS-файл,
сохраянем все в ту же папку с именем "contentLoader.as". Вот его содержимое

Code

package complex{/*Определяем принадлежность к пакету complex*/
import flash.display.*;/*Подключаем пакет для работы с дисплеем*/
import flash.ui.*;/*пакет содержащий классы необходимые для работы с мышью и клавиатурой*/
import flash.events.*;/*Подключение пакета контролирующего события, в духе нажатие мыши и т.д.*/
import flash.net.*;/*Этот пакет необходим для загрузки различной информации из вне*/
import flash.text.*;/*Пакет содержащий классы необходимые для работы с текстом*/

public class contentLoader{/*Объявляем класс.*/

public var loader:URLLoader = new URLLoader();/*Создаем новый загрузчик, его мы будем использовать для загрузки содержимого текстовых файлов*/
public var loader2:URLLoader = new URLLoader();/*Создаем новый загрузчик, его мы будем использовать для загрузки содержимого CSS-Файла*/

public var tx:TextField;/*Создаем новый обект текстового поля которому будет присвоено основное текстовое поле проекта*/
public var wa:String;/*Новая переменная строка, ей будет присвоен путь до текстового файла с информацией*/
public var formatFile:String;/*Еще одна строка, она получит в качестве значения путь до CSS-файла*/

public var l:TextField;/*Это текстовое поле будет связано с текстовым полем в котором отображается название текущей страницы*/
public var lC:String;/*Эта строка получит значение этого названия*/
public var lF:TextFormat;/*А это текстовый формат который будет применен к названию "страницы"*/

public var scrLine:Sprite;/*Линия под скролом*/
public var scrDrag:Sprite;/*ползунок от скрола*/
public var flStage:Sprite;/*Созданая в основном классе невидимая кнопка*/
/*Последние три Спрайта в этом классе напрямую никак не используются, а просто передаются дальше в качестве параметров при вызове класса скрола*/

public function loadInformationOnPress(mc:Sprite, txt:TextField, way:String, format:String, lab:TextField, laC:String, laF:TextFormat, scrl:Sprite, scrd:Sprite, flst:Sprite)
{/*Функция для загрузки контента по нажатии на кнопку*/

l=lab;
lC=laC;
lF=laF;
tx=txt;
wa=way;
formatFile=format;
scrLine=scrl;
scrDrag=scrd;
flStage=flst;
/*Переприсвоение полученных функцией в качестве параметров значений в заранее подготовленные переменные, какая переменная что значит описанно выше*/

mc.addEventListener(MouseEvent.CLICK, callInformation);/*Добавляем к кнопке "слушателя" который по "клику" на кнопке будет вызывать функцию callInformation*/

}

public function callInformation(events:Event){/*Функция которая вызывается при "клике" по кнопке, функция содержимое которой по сути представляет из себя просто вызов двух других функций*/

loadInformation(tx,wa,formatFile,scrLine,scrDrag,flStage);/*Вызов функции производящей загрузку информации, параметры передаваемые этой функции разобраны в оописании основного класса программы*/
setLabel(l,lC,lF);/*Функция которая выводит название текущей страницы и оформляет его*/
/*Параметры:
1. Текстовое поле.
2. Значение которое ему надо присвоить(строка).
3. Формат текста который следует к нему применить.*/
}
function setLabel(la:TextField,laCont:String,labForm){/*Функция для выведения названия текущей страницы*/
la.text=laCont;/*Присваиваем необходимое значение*/
la.setTextFormat(labForm);/*Устанавливаем формат*/
}

public function loadInformation(txt:TextField,way:String, format:String,scrl:Sprite,scrd:Sprite,flst:Sprite){/*Функция которая начинает загрузку контента*/
tx=txt;
scrLine=scrl;
scrDrag=scrd;
flStage=flst;
formatFile=format;
/*Переприсвоение полученных функцией в качестве параметров значений в заранее подготовленные переменные, какая переменная что значит описанно выше*/

var contentName:URLRequest = new URLRequest(way);/*Новый запрос для загрузки*/
loader.addEventListener(Event.COMPLETE, contentLoaded);/*Цепляем к ранее созданому загрузчику слушателя на окончание файла*/
loader.load(contentName);/*Начинаем загрузку текстового файла*/
}

function contentLoaded(events:Event){/*Функция которая вызывается когда содержимое текстового файла загружено*/
var req:URLRequest = new URLRequest(formatFile); /*Еще один запрос для загрузки, на этот раз CSS-файла*/
loader2.addEventListener(Event.COMPLETE, onCSSFileLoaded); /*Добавляем к загрузчику для CSS-файла "слушателя" на окончание загрузки*/
loader2.load(req); /*Начинаем загрузку CSS-Файла*/
}

public function onCSSFileLoaded(event:Event):void /*Функция по окончанию загрузки CSS-файла*/
{
var sheet:StyleSheet = new StyleSheet(); /*Новый объект CSS*/
sheet.parseCSS(loader2.data); /*Переносим полученное содержимое CSS-Файла в специальный объект только-что созданный нами*/
tx.styleSheet = sheet; /*Включаем форматирование содержимого текстового поля при помощи объекта с содержимым из нашего CSS-файла*/
tx.htmlText = loader.data;/*Присваиваем текстовому полю текст полученный из текстового файла немного ранее*/

var myScrollBarer:ScrollBarer = new ScrollBarer();/*Экземпляр класса скробара*/
myScrollBarer.addScroll(tx,scrLine,scrDrag,flStage);/*Вызываем функцию скролбара*/
/*Параметры:
1. Текстовое поле к которому цепляется скрол
2. Линия по которой будем перемещать ползунок.
3. Сам ползунок.
4. Невидимая кнопка размером со сцену, которую мы создавали в основном классе.
*/
}

}
}

 

Информацию загрузили, надо бы скролбар для нее. очередной класс - "ScrollBarer.as". Определяемся что нам надо от этого класса скроллинг при передвижении полузнка мышью, вращении колесика, и мне еще захотелось чтобы при нажатии на прямоугольник под ползунком, ползунок бы сам двигался к курсору. Это реализуется таким вот кодом.

Code

package complex{/*Определяем принадлежность к пакету complex*/
import flash.display.*;/*Подключаем пакет для работы с дисплеем*/
import flash.ui.*;/*пакет содержащий классы необходимые для работы с мышью и клавиатурой*/
import flash.events.*;/*Подключение пакета контролирующего события, в духе нажатие мыши и т.д.*/
import flash.text.*;/*Пакет содержащий классы необходимые для работы с текстом*/
import flash.geom.*;/*Пакет содержит классы необходимые при создании геометрических фигур*/
public class ScrollBarer{/*Объявляем класс.*/

public var sost:Boolean;/*Логическая переменная будет использоваться при отслеживании нажат или отпущен ползунок*/
public var scrLine:Sprite;/*Новый спрайт, ему будет передана линия под скролом*/
public var scrDrag:Sprite;/*Новый спрайт, ему будет передан ползунок скрола*/
public var Text:TextField;/*Текстовое поле к которому будем цеплять скрол*/

public var dragPart:Rectangle;/*Объявляемый новый "прямоугольник", его мы будем использовать для ограничения области перемещения ползунка*/

public var firstTime:Boolean=false;/*Логическая переменная будет использовна для однократного использования фрагмента кода в обработчикe ENTER_FRAME, подобный ход мы уже применяли в классе отвечающем за анимацию кнопочек*/
public var lScroll:Boolean=false;/*Очередная булеана, будет использована при создании скролирования по нажатии на ограничивающую линию скрола*/

public function addScroll(txt:TextField,scroll_line:Sprite, scroll_Drag:Sprite,fullStage:Sprite){/*Функция которая будет вызываться для создания скрола, параметры описаны в разборе класса contentLoader*/
scrLine = scroll_line;
scrDrag = scroll_Drag;
Text=txt;
/*Переприсвоение полученных функцией в качестве параметров значений в заранее подготовленные переменные, какая переменная что значит описанно выше*/
dragPart=new Rectangle(scrLine.x, scrLine.y, 0, scrLine.height-scrDrag.height);/*Настраиваеам прямоугольник для ограничения области перемещения ползунка, координаты соовпадают с координатами линии скрола, ширина равна нулю т.к. нам не нужны смещения по оси Х, высота равняется высоте линии минус высота ползунка, вычитаем высота ползунка чтобы он останавливался когда его нижний край дойдет до конца ограничивающей линии, а не когда он весь выйдет за ее пределы*/

scroll_Drag.addEventListener(MouseEvent.MOUSE_DOWN, startMove);/*"слушатель" для ползунка реагирующий на его нажатие*/
scroll_Drag.addEventListener(MouseEvent.MOUSE_UP, stopMove);/*"слушатель" ползунка реагирующий на отпускние мыши на нем*/
/*Но ведь отжать кнопку мыши можно не только на ползунке, но и скажем на текстовом поле или где-то просто на свободной области, поэтому надо добавить еще несколько слушателей, вот здесь то нам и понадобилась наша невидимая кнопочка*/
fullStage.addEventListener(MouseEvent.MOUSE_UP, stopMove);/*собственно "слушатель" для якобы свободной области сцены(нашей невидимой кнопки)*/
txt.addEventListener(MouseEvent.MOUSE_UP, stopMove);/*"слушатель" на отпускание кнопки мышки над текстовым полем*/
scroll_line.addEventListener(MouseEvent.MOUSE_DOWN, lineWheelStart);/*отслеживаем нажатие на линию скрола*/
scroll_line.addEventListener(MouseEvent.MOUSE_UP, lineWheelFinish);/*отслеживаем отпускание кнопки мыши над линией скрола*/
scroll_Drag.addEventListener(Event.ENTER_FRAME, render);/*"слушатель" события ENTER_FRAME для нашего ползунка, указаная в параметрах функция будет вызываться каждый кадр*/
fullStage.addEventListener(MouseEvent.MOUSE_WHEEL, wheelScroll);/*Отслеживание колесика мыши над невидимой кнопкой*/
txt.addEventListener(MouseEvent.MOUSE_WHEEL, wheelScroll);/*Отслеживание колесика мыши над текстовым полем*/

}

function startMove(events:MouseEvent):void{/*Функция по нажатию на ползунок*/
sost=true;/*Булеана получает значение true, значит ползунок нажат*/
scrDrag.startDrag(false,dragPart);/*Начинаем перемещение ползунка за мышью в пределах, очерченных нами ранее при создании прямоугольника*/
}
function stopMove(events:Event):void{/*Функция по отпускании кнопки мышки*/
sost=false;/*Булеана получает значение false, значит ползунок отпустили*/
lScroll=false;/*Не забываем, что у нас есть еще такая вещь, как скрол по нажатии, на линию скролбара, так что его здесь тоже бы отключить надо*/
scrDrag.stopDrag();/*Прекращаем передвижение ползунка*/
}

function render(events:Event){/*Функция которая выполняется каждый кадр*/
if(!firstTime){/*Проверка на то который раз выполняется этот кусочек кода.*/
scrDrag.y=scrLine.y;/*Перебрасываем ползунок в начальное положение, это необходимо, чтобы при открытии каждой новой "страницы" полузнок стоял вверху, а страница отображалась сначала, а не сразу открывалсь где-нибудь по середине*/
firstTime=true;/*Ставим галочку, что все уже выполнено и выполянть еще раз не надо*/
if(Text.maxScrollV<3){/*Проверяем размер загруженного контента*/
scrDrag.visible=false;/*если скролбар не нужен - скрываем его*/
scrLine.visible=false;
}else{/*нужен?*/
scrDrag.visible=true;/*отображаем скролбар*/
scrLine.visible=true;  
 }
}
if(!sost){events.target.gotoAndStop(1);}else{events.target.gotoAndStop(2);}/*В зависимости от того нажат или нет ползунок переходим на разные кадры. Если нет, то на первый. Да - на второй. Это необходимо для изменения вида скрола по нажатии.*/
 
Text.scrollV = Math.round(((scrDrag.y - scrLine.y)/(scrLine.height-scrDrag.height))*Text.maxScrollV);/*Изменяем скроллинг текста в зависимости от положения ползунка, формула не сложная спокойно выводится на листике карандашиком*/

if(lScroll){/*Если нажата линия скрола*/
if(scrLine.y+scrLine.mouseY-scrDrag.height>scrDrag.y){/*Если нажато ниже, чем находится ползунок*/
scrDrag.y+=4;}/*двигаемся вниз*/
if(scrLine.y+scrLine.mouseY<scrDrag.y){/*Если нажато выше, чем находится ползунок*/
scrDrag.y-=4;}/*двигаемся вверх*/
}

if(scrDrag.y<scrLine.y){scrDrag.y=scrLine.y}
if(scrDrag.y>scrLine.y+scrLine.height-scrDrag.height){scrDrag.y=scrLine.y+scrLine.height-scrDrag.height}
/*Две строки выше не позволяют ползунку покидать пределы ограничивающей линии*/
}  

function wheelScroll(events:MouseEvent){/*функция при использовании колесика*/
scrDrag.y+=events.delta*-3;/*Изменяем координату ползунка в зависимости от силы вращения, это значение как и в АС 2.0 передается в числах кратным трем.*/
}

function lineWheelStart(events:Event){/*функция по нажатии на направляющую линию*/
lScroll=true;/*true, значит линия нажата и пора предпринимать соответсвующие действия*/
}
function lineWheelFinish(events:Event){
lScroll=false;/*false, перестаем менять положение ползунка*/
}  

}
}

 

Уфф, дело близится к концу, нам осталось лишь написать класс для передвижения маркера
обозначающего, то какой из пунктов меню сейчас открыт. Класс - "MarkerTween.as". Код:

Code

package complex{/*Определяем принадлежность к пакету complex*/
import flash.display.*;/*Подключаем пакет для работы с дисплеем*/
import flash.ui.*;/*пакет содержащий классы необходимые для работы с мышью и клавиатурой*/
import flash.events.*;/*Подключение пакета контролирующего события, в духе нажатие мыши и т.д.*/
import fl.transitions.Tween; /*Импорт класса програмной анимации*/
import fl.transitions.TweenEvent; /*Импорт класса с событиями при програмной анимации*/
import fl.transitions.easing.*;/*Импорт класса отвечающего за способы анимации*/
public class MarkerTween{/*Объявляем класс.*/

public var myMarker:Sprite;/*Спрайт будет использоваться как перемещаемый нами маркер*/
public var markerFinish:Number;/*Переменная будет хранить координаты окончания анимации*/
public var yMovement:Tween;/*Новый твин, будет использован для перемещения по оси Y*/
public var rMovement:Tween;/*Твин для имитации переворота в конце*/
public var TweenTime:Number;/*Переменная будет хранить время анимации для изменения координаты по оси Y*/

public function moveMarker(but:Sprite, marker:Sprite, endCor:Number,tTime){/*Функция которая будет вызываться из основного класса, параметры подробно разобраны там же*/
myMarker=marker;
markerFinish=endCor;
TweenTime=tTime;
/*Переприсвоение полученных функцией в качестве параметров значений в заранее подготовленные переменные, какая переменная что значит описанно выше*/
but.addEventListener(MouseEvent.CLICK, mover);/*Цепляем к кнопке "слушателя" на клик по ней*/
 }
function mover(events:Event){/*Функция по клику*/
yMovement = new Tween(myMarker, "y", Back.easeOut, myMarker.y, markerFinish, TweenTime, true);/*Запускаем анимацию по оси Y*/
yMovement.addEventListener(TweenEvent.MOTION_FINISH, rotateMove);/*"Слушатель" на окончание анимации*/
}
function rotateMove(events:Event){/*Функция по окончании анимаци по оси Y*/
rMovement = new Tween(myMarker, "scaleY", Back.easeIn, 1, -1, TweenTime*1.5, true);/*Запускаем анимацию, вращения*/
}

}
}

Вот и все. Если вы все сделали правильно, то по нажатии Ctrl+Enter - наслаждаетесь готовым проектом. Если же, что-то не выходит, то ниже приложен исходник который поможет вам разобраться.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=20720