В этом уроке вы узнаете, как создать простой Image Rotator с нуля, используя Flash, XML и ActionScript 3.0.
Шаг 1: Краткий обзор
Этот ротатор изображений создан почти полностью из одного кода.
На первых шагах мы настроим свойства файла Fla и добавим несколько шрифтов, чтобы информация об изображении выглядела лучше. Мы также добавляем предварительный загрузчик, чтобы указать автоматический переход изображений.
Шаг 2: настройка
Откройте Flash и создайте новый файл Flash (ActionScript 3.0).

Установите размер сцены 600 x 300 пикселей и скорость кадра 24 кадров в секунду.

Шаг 3: Вставить шрифты
Чтобы лучше рассмотреть наше приложение, мы будем использовать встроенные шрифты.
Откройте панель «Библиотека» (Cmd + L) и щелкните правой кнопкой мыши в области элементов, чтобы открыть контекстное меню.

Выберите Новый шрифт и выберите понравившийся шрифт. Не забудьте выбрать фактический размер, который вы собираетесь использовать в фильме.

Я использовал Helvetica Bold для названия изображения и FFF Harmony для описания.

Шаг 4: Preloader
Предварительный загрузчик MovieClip будет использоваться в качестве индикатора прогресса, это скажет пользователю, что изображения воспроизводятся автоматически.

В этом примере я использовал Apple Inspired Preloader, который мы создали ранее в ActiveTuts +. Мы просто используем анимацию, поэтому нет необходимости копировать код. Наш код будет переходить к следующему изображению каждый раз, когда зацикливается анимация предзагрузчика.
Шаг 5: Получить несколько изображений
Это не был бы Image Rotator без изображений, поэтому выберите их из своей личной коллекции или загрузите несколько для тестирования.
Это изображения из демонстрации, полученные от Flickr , все с лицензией Creative Commons .
Размер изображения был увеличен до 600×300 пикселей, чтобы соответствовать размеру фильма.
Шаг 6: Написать XML
XML-файл будет загружен приложением; этот файл будет содержать всю информацию об изображениях, такую как заголовок, URL-адрес изображения и описание.
Откройте ваш любимый редактор и напишите:
|
1
2
3
4
5
6
|
<?xml version=»1.0″?>
<images>
<image title=»Grass 01″ src=»images/Grass.png» description=»Photo by: 100kr on Flickr»/>
<image title=»Deep Impact on Planet Color» src=»images/Water.png» description=»Photo by: spettacolopuro on Flickr»/>
<image title=»Yosemite: Fall Colours» src=»images/Yosemite.png» description=»Photo by: tibchris on Flickr»/>
</images>
|
Шаг 7: Создайте класс документа
Создайте новый документ ActionScript и сохраните его как ImageRotator.as .

Шаг 8: Импортируйте необходимые классы
Это обязательные занятия. Более подробное описание каждого класса см. В справке по Flash (нажмите «F1» во Flash).
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package
{
import fl.transitions.Tween;
import fl.transitions.easing.Strong;
import fl.transitions.TweenEvent;
import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.display.Loader;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import flash.text.AntiAliasType;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.Event;
import flash.events.MouseEvent;
|
Шаг 9: Начните урок
Ключевое слово extends определяет класс, который является подклассом другого класса. Подкласс наследует все методы, свойства и функции, так что мы можем использовать их в нашем классе.
Мы сделаем наш класс документа расширенным Sprite, так как ему не нужна временная шкала.
|
1
2
|
public class ImageRotator extends Sprite
{
|
Шаг 10: объявить переменные
Это переменные, которые мы будем использовать; каждый объясняется в комментариях.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
private var xml:XML;
private var urlLoader:URLLoader;
private var imagesVector:Vector.<Loader> = new Vector.<Loader>();
private var imagesCounter:int = 0;
private var tween:Tween;
private var lastTarget:*;
private var tweening = false;
private var infoCounter:int = 0;
private var infoPanel:Sprite = new Sprite();
private var titleField:TextField = new TextField();
private var description:TextField = new TextField();
private var titleFormat:TextFormat = new TextFormat();
private var descriptionTF:TextFormat = new TextFormat();
private var timer:Timer;
private var preloader:Preloader = new Preloader();
private var added:Boolean;
private var titleFont:Helvetica = new Helvetica();
private var bitmapFont:Harmony = new Harmony();
|
Шаг 11: Написать функцию конструктора
Конструктор — это функция, которая запускается, когда объект создается из класса. Этот код выполняется первым, когда вы создаете экземпляр объекта или запускаетесь с использованием класса документа. В этом случае это будет первый запуск кода при запуске нашего SWF.
Исходные параметры имеют значения по умолчанию; это позволит нам использовать класс как класс документа и как экземпляр.
Параметры — это URL-адрес файла XML и время, в течение которого объект Timer будет ожидать перехода между изображениями; это число должно быть больше, чем продолжительность перехода Tween (одна секунда по умолчанию).
|
1
2
|
public function ImageRotator(xmlPath:String = «images.xml», interval:int = 2000):void
{
|
Шаг 12: Напишите код конструктора
Этот код идет внутри конструктора. Он запускает таймер, устанавливает формат текста по умолчанию для текстовых полей и вызывает функцию loadXML.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
timer = new Timer(interval);
titleFormat.bold = true;
titleFormat.font = titleFont.fontName;
titleFormat.color = 0xFFFFFF;
titleFormat.size = 14;
descriptionTF.font = bitmapFont.fontName;
descriptionTF.color = 0xEEEEEE;
descriptionTF.size = 8;
titleField.defaultTextFormat = titleFormat;
titleField.autoSize = TextFieldAutoSize.LEFT;
titleField.embedFonts = true;
titleField.antiAliasType = AntiAliasType.ADVANCED;
description.defaultTextFormat = descriptionTF;
description.autoSize = TextFieldAutoSize.LEFT;
description.embedFonts = true;
loadXML(xmlPath);
}
|
Шаг 13: загрузите файл XML
Эта функция использует объект URLLoader для загрузки файла XML, указанного в параметре конструктора. Функция parseXML (на следующем шаге) настроена на выполнение после завершения загрузки.
|
1
2
3
4
5
|
private function loadXML(file:String):void
{
urlLoader = new URLLoader(new URLRequest(file));
urlLoader.addEventListener(Event.COMPLETE, parseXML);
}
|
Шаг 14: разобрать файл XML
Данные xml назначаются объекту xml, и вызывается функция для загрузки изображений.
|
1
2
3
4
5
|
private function parseXML(e:Event):void
{
xml = new XML(e.target.data);
loadImages();
}
|
Шаг 15: Загрузите изображения
Оператор for используется для получения количества изображений в xml, загрузки изображений с использованием объекта Loader и сохранения этого Loader в объекте Vector, который был определен ранее. Когда загрузка изображения завершена, выполняется функция sortImages.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
private function loadImages():void
{
for (var i:int = 0; i < xml.children().length(); i++)
{
var loader:Loader = new Loader();
loader.load(new URLRequest(xml.children()[i].@src));
imagesVector.push(loader);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, sortImages);
}
}
|
Шаг 16: Сортировка изображений
Эта функция добавляет изображения на сцену и сортирует их; когда все изображения загружены, он вызывает функции, которые создают информационную панель и слушателей мыши.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
private function sortImages(e:Event):void
{
imagesCounter++;
for (var i:int = imagesVector.length — 1; i >= 0; i—) //go backwards…
{
addChild(imagesVector[i]);
}
if (imagesCounter == imagesVector.length) //If all images are loaded
{
createInfoPanel();
timer.addEventListener(TimerEvent.TIMER, autoChange);
timer.start();
addPreloader();
addActions();
}
}
|
Шаг 17: добавь слушателей мыши к изображениям
Мы используем оператор for для установки слушателей мыши на каждое изображение. Это очень простая форма контроля; когда пользователь щелкает изображение, вызывается функция обработчика changeImage.
|
1
2
3
4
5
6
7
8
|
private function addActions():void
{
for (var i:int = 0; i < imagesVector.length; i++)//Gets the number of images
{
//Sets the listener, changeImage function will be executed when an image is clicked
imagesVector[i].addEventListener(MouseEvent.MOUSE_UP, changeImage);
}
}
|
Шаг 18: Ручной переход
Этот код будет запущен, когда пользователь щелкнет изображение. Прочитайте комментарии в коде для деталей.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
private function changeImage(e:MouseEvent):void
{
timer.stop();
if(added) //Check if the preloader is in stage, if true, removes it, if already removed, nothing happens
{
removeChild(preloader);
added = false;
}
if (! tweening) //If a transition is not in progress
{
lastTarget = e.target;
tween = new Tween(e.target,»alpha»,Strong.easeOut,1,0,1,true);
tween.addEventListener(TweenEvent.MOTION_FINISH, changeDepth);
tweening = true;
infoCounter++;
if (infoCounter >= xml.children().length()) //If the infoCounter is grater than the total number of images
{
infoCounter = 0;
titleField.text = xml.children()[infoCounter].
description.text = xml.children()[infoCounter].
}
else
{
titleField.text = xml.children()[infoCounter].
description.text = xml.children()[infoCounter].
}
}
}
|
Шаг 19: переместить изображение назад
Переход между изображениями основан на альфа-анимации, поэтому вы увидите следующее изображение после завершения перехода. Однако, если вы щелкнете по нему, вы нажмете на то же изображение, что и раньше, хотя оно не видно. Это исправит это.
|
1
2
3
4
5
6
|
private function changeDepth(e:TweenEvent):void //When the alpha is 0
{
setChildIndex(lastTarget, 0);
lastTarget.alpha = 1;
tweening = false;
}
|
Шаг 20. Создание информационной панели
Это создаст полупрозрачную панель с текстом, сгенерированным из тегов XML Title и Description.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
private function createInfoPanel():void
{
//Draw a black rectangle with 50% alpha
infoPanel.graphics.beginFill(0x000000, 0.5);
infoPanel.graphics.drawRect(0, 0, 600, 50);
infoPanel.graphics.endFill();
//Position and set the value of the title field
titleField.text = xml.children()[infoCounter].
titleField.x = 5;
titleField.y = 5;
//Position and set the value of the description field
description.text = xml.children()[infoCounter].
description.x = 7;
description.y = 22;
infoPanel.y = 250;
//Add the children
infoPanel.addChild(titleField);
infoPanel.addChild(description);
addChild(infoPanel);
}
|
Шаг 21: обработать автоматический переход
Этот код обрабатывает автоматический переход; это вызвано событием TIMER объекта Timer.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private function autoChange(e:TimerEvent):void
{
infoCounter++;
lastTarget = imagesVector[xml 1=»-» 2=»infoCounter» language=».children().length()»][/xml];
tween = new Tween(imagesVector[xml 1=»-» 2=»infoCounter» language=».children().length()»][/xml],»alpha»,Strong.easeOut,1,0,1,true);
/* The same actions of the manual transition, change info etc. */
tween.addEventListener(TweenEvent.MOTION_FINISH, changeDepth);
tweening = true;
if (infoCounter >= xml.children().length())
{
infoCounter = 0;
titleField.text = xml.children()[infoCounter].
description.text = xml.children()[infoCounter].
}
else
{
titleField.text = xml.children()[infoCounter].
description.text = xml.children()[infoCounter].
}
}
|
Шаг 22: поместите мувиклип Preloader
Этот кусок скрипта добавляет и размещает предзагрузчик.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
private function addPreloader():void
{
added = true;
preloader.scaleX = 0.08;
preloader.scaleY = 0.08;
preloader.x = (600 — preloader.width/2) — 12;
preloader.y = (300 — preloader.height/2) — 12;
addChild(preloader);
}
}
}
|
Это завершает класс ImageRotator .
Шаг 23: Использование класса
Есть два способа использовать этот класс. Вы можете использовать его в своем коде как экземпляр или как класс документа с параметрами по умолчанию, которые мы установили ранее.
Если вы решите создать экземпляр этого класса и использовать его в своем коде, это пример того, как его использовать:
|
1
2
3
4
5
|
import ImageRotator;
var ir:ImageRotator = new ImageRotator(«images.xml», 1100);
addChild(ir);
|
Таким образом, вы можете установить файл XML для загрузки и интервал перехода без необходимости редактировать код класса.
В противном случае смотрите следующий шаг.
Шаг 24: Использование класса документа
В файле .fla перейдите на панель свойств и напишите ImageRotator в поле Class. Помните, что для этого будут использоваться параметры по умолчанию.
Вывод
Это всего лишь пример ротатора изображения и хороший способ начать создавать собственную галерею изображений.
Спасибо за прочтение!

