Статьи

Создание вращателя изображения во Flash с использованием XML и ActionScript 3.0

В этом уроке вы узнаете, как создать простой Image Rotator с нуля, используя Flash, XML и ActionScript 3.0.




Этот ротатор изображений создан почти полностью из одного кода.

На первых шагах мы настроим свойства файла Fla и добавим несколько шрифтов, чтобы информация об изображении выглядела лучше. Мы также добавляем предварительный загрузчик, чтобы указать автоматический переход изображений.

Откройте Flash и создайте новый файл Flash (ActionScript 3.0).

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

Чтобы лучше рассмотреть наше приложение, мы будем использовать встроенные шрифты.

Откройте панель «Библиотека» (Cmd + L) и щелкните правой кнопкой мыши в области элементов, чтобы открыть контекстное меню.

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

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

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

В этом примере я использовал Apple Inspired Preloader, который мы создали ранее в ActiveTuts +. Мы просто используем анимацию, поэтому нет необходимости копировать код. Наш код будет переходить к следующему изображению каждый раз, когда зацикливается анимация предзагрузчика.

Это не был бы Image Rotator без изображений, поэтому выберите их из своей личной коллекции или загрузите несколько для тестирования.

Это изображения из демонстрации, полученные от Flickr , все с лицензией Creative Commons .

Размер изображения был увеличен до 600×300 пикселей, чтобы соответствовать размеру фильма.

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>

Создайте новый документ ActionScript и сохраните его как ImageRotator.as .

Это обязательные занятия. Более подробное описание каждого класса см. В справке по 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;

Ключевое слово extends определяет класс, который является подклассом другого класса. Подкласс наследует все методы, свойства и функции, так что мы можем использовать их в нашем классе.

Мы сделаем наш класс документа расширенным Sprite, так как ему не нужна временная шкала.

1
2
public class ImageRotator extends Sprite
{

Это переменные, которые мы будем использовать; каждый объясняется в комментариях.

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();

Конструктор — это функция, которая запускается, когда объект создается из класса. Этот код выполняется первым, когда вы создаете экземпляр объекта или запускаетесь с использованием класса документа. В этом случае это будет первый запуск кода при запуске нашего SWF.

Исходные параметры имеют значения по умолчанию; это позволит нам использовать класс как класс документа и как экземпляр.

Параметры — это URL-адрес файла XML и время, в течение которого объект Timer будет ожидать перехода между изображениями; это число должно быть больше, чем продолжительность перехода Tween (одна секунда по умолчанию).

1
2
public function ImageRotator(xmlPath:String = «images.xml», interval:int = 2000):void
{

Этот код идет внутри конструктора. Он запускает таймер, устанавливает формат текста по умолчанию для текстовых полей и вызывает функцию 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);
}

Эта функция использует объект 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);
}

Данные xml назначаются объекту xml, и вызывается функция для загрузки изображений.

1
2
3
4
5
private function parseXML(e:Event):void
{
    xml = new XML(e.target.data);
    loadImages();
}

Оператор 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);
 
    }
}

Эта функция добавляет изображения на сцену и сортирует их; когда все изображения загружены, он вызывает функции, которые создают информационную панель и слушателей мыши.

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();
    }
}

Мы используем оператор 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);
    }
}

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

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].
        }
    }
}

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

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;
}

Это создаст полупрозрачную панель с текстом, сгенерированным из тегов 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);
}

Этот код обрабатывает автоматический переход; это вызвано событием 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].
    }
}

Этот кусок скрипта добавляет и размещает предзагрузчик.

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 .

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

Если вы решите создать экземпляр этого класса и использовать его в своем коде, это пример того, как его использовать:

1
2
3
4
5
import ImageRotator;
 
var ir:ImageRotator = new ImageRotator(«images.xml», 1100);
 
addChild(ir);

Таким образом, вы можете установить файл XML для загрузки и интервал перехода без необходимости редактировать код класса.

В противном случае смотрите следующий шаг.

В файле .fla перейдите на панель свойств и напишите ImageRotator в поле Class. Помните, что для этого будут использоваться параметры по умолчанию.

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

Спасибо за прочтение!