Февраль 2011

Руководство по actionscript. часть 6, стр. 005

Даже если один SWF-файл загружает другой SWF-файл, который, в свою очередь, загружает внешние элементы, относительные адреса URL все равно разрешаются

либо относительно владельца сцены (в случае непосредственного запуска), либо относительно веб-страницы, содержащей встроенное приложение Flash Player (в случае открытия страницы).

Предположим, что мы открываем гипотетическое приложение SlideShow. swf непосредственно в приложении Flash Player. Кроме того, предположим, что приложение SlideShow. swf загружает приложение SunsetViewer. swf из предыдущего примера. В данном случае все относительные URL-адреса в приложении SunsetViewer. swf должны быть сформированы относительно файла SlideShow. swf (обратитевнимание: не относительно приложения SunsetViewer. swf!). Подобным образом, если бы приложение SlideShow. swf открывалось через веб-страницу, все относительные адреса URL в приложении SunsetViewer. swf должны были быть сформированы относительно данной страницы.

^ I Вы можете полностью избежать проблем, связанных с различными вариантами разре-м$ 4 „ шения относительных адресов URL, сохранив все HTML-, SWF-файлы и файлы внешних —отображаемых элементов в одной директории.

Вернемся к нашему примеру класса SunsetViewer. Ранее в листинге 28.1 мы создали экземпляр класса Loader. В листинге 28.2 представлен обновленный класс SunsetViewer, в который был добавлен код, создающий запрос для относительного URL-адреса «sunset. jpg». Как было отмечено ранее, для упрощения нашего примера мы предполагаем, что файлы sunset. jpg и SunsetViewer. swf находятся в одной директории — это позволяет избежать любых сложностей, связанных с разрешением относительных адресов URL.

Листинг 28.2. Определение местоположения элемента

package { import flash. display.*:

import flash. net. URLRequest; // Импортируем класс URLRequest

public class SunsetViewer extends Sprite { private var loader:Loader:

public function SunsetViewer ( ) { loader = new Loader( );

// Определяем местоположение элемента в виде «sunset. jpg» var urlRequest:URLRequest = new URLRequest(«sunset. jpg»);

}

}

}

Теперь, когда мы определили местоположение файла sunset. jpg, загрузим его.

Руководство по actionscript. часть 6, стр. 006

Начало загрузки

До настоящего момента мы уже создали объекты Loader и URLRequest. Теперь соединим их, чтобы загрузить элемент. Чтобы начать загрузку, мы передаем наш экземпляр класса URLRequest в метод load ( ) экземпляра класса Loader, как показано в листинге 28.3.

Листинг 28.3. Начало загрузки

package { import flash. display.*; import flash. net. URLRequest;

public class SunsetViewer extends Sprite { private var loader;Loader;

public function SunsetViewer ( ) { loader = new Loader( );

var url;URLRequest = new URLRequest(«sunset. jpg»); // Начинаем загрузку loader. load(url);

} •

Итак, вот основной код, необходимый для загрузки внешнего отображаемого элемента на этапе выполнения:

var loader-.Loader = new Loader( );

var url;URLRequest = new URLRequesti» адресШО-Элемента»);

loader. load(url);

Здесь адресиШЭлемента — это местоположение загружаемого элемента. Кроме того, допустимо и достаточно распространено объединять вторую и третью строки из предыдущего кода в одну, как показано в следующем коде:

var loader;Loader = new Loader( );

1 oader. 1 oad(new URLRequest(«адресиШэлемента»)):

^ 1 Чтобы отменить выполняемую операцию загрузки, используйте метод экземпляра close()

—-3* -

класса Loader.

Руководство по actionscript. часть 6, стр. 007

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

Обращение к загруженному элементу

Благополучно обратиться к загруженному элементу можно только после того, как среда выполнения Flash проведет его инициализацию. На этапе инициализации среда выполнения Flash создает экземпляр элемента, добавляет его в объект Loader, загрузивший этот элемент, и выполняет любые задачи, необходимые для подготовки элемента к использованию.

Этап процесса инициализации, на котором создается экземпляр, отличается для разных типов элементов.

? Для растровых изображений экземпляр создается в тот момент, когда загрузка внешнего файла полностью завершена. Тогда загруженные пиксельные данные автоматически помещаются в объект BitmapData, который связывается

с новым объектом Bitmap. Загруженное изображение представляется объектом Bitmap.

? Для SWF-файлов экземпляр создается в тот момент, когда получены все элементы и классы для кадра 1 (включая основной класс SWF-файла). Тогда среда выполнения Flash создает экземпляр основного класса SWF-файла и выполняет его конструктор. Загруженный SWF-файл представляется экземпляром основного класса.

^ I Для простоты в дальнейшем материале мы будем называть созданный экземпляр (либо м$ л * объект Bitmap, либо экземпляр основного класса SWF-файла) объектом элемента.

После создания экземпляра загруженного элемента объект элемента автоматически добавляется в объект Loader. Объект элемента является первым и единственным возможным ребенком объекта Loader. Если элементом оказывается SWF-файл, то любой код, находящийся в первом кадре этого файла, выполняется сразу после добавления экземпляра его основного класса в объект Loader.

После того как объект элемента будет добавлен в объект Loader и процесс инициализации будет завершен, среда Flash выполнит диспетчеризацию события Event. INIT. Когда возникает событие Event. INIT, загруженный элемент считается готовым к использованию. Любой код, которому необходим доступ к загруженному элементу, должен выполняться только после возникновения события Event. INIT.

Руководство по actionscript. часть 6, стр. 008

Не пытайтесь обращаться к загружаемому элементу до возникновения события Event. INIT.

Приемники, которые желают получать уведомления о возникновении события Event. INIT, должны быть зарегистрированы в объекте Loaderlnf о объекта элемента, а не в объекте Loader, над которым изначально был вызван метод load ( ). Объект Loaderlnfo— это отдельный объект, который представляет информацию о загруженном элементе. Любой экземпляр класса Loader предоставляет ссылку на объект Loaderlnfo своего загружаемого элемента через переменную экземпляра contentLoaderInf о. Таким образом, чтобы зарегистрировать приемник события для события Event. INIT некоторого элемента, мы используем следующий обобщенный код:

объект1_оас! ег. contentLoader Inf о. addEventLi stener (Event. INIT, приемникСобытияШ1Т);

Здесь объект1_оас! ег — это объект Loader, загружающий элемент, а приемникСобы-тияШП — ссылка на функцию, которая будет обрабатывать событие Event. INIT. После возникновения события Event. INIT благополучно обратиться к загруженному элементу можно через переменную content или метод getChildAt ( ) класса Loader, как показано ниже:

объект1оабег. content объект1оабег. getChi1dAt СО)

Обратите внимание на значение 0 в выражении getChildAt (0). Элемент является единственным ребенком объекта Loader, поэтому он находится на глубине с индексом 0.

Следующий код демонстрирует приемник события Event. INIT, который устанавливает позицию загруженного и проинициализированного элемента. Для демонстрации двух различных способов обращения к загруженному элементу этот код устанавливает горизонтальную позицию с помощью переменной content, а вертикальную позицию — с использованием выражения getChildAt (0).

private function initListener (e:Event):void { объектLoader. content. x = 50; oбъeктLoader. getCh^^(\^t(Q).y = 75;

}

В качестве альтернативы обратиться к загруженному элементу можно через объект Event, передаваемый в функцию-приемник события Event. INIT. Этот объект определяет переменную target, которая ссылается на объект Loaderlnfo элемента. Каждый объект Loaderlnfo ссылается на свой соответствующий элемент через переменную экземпляра content. Таким образом, внутри функции-приемника события Event. INIT ссылка на загруженный элемент может быть получена с помощью выражения o6beKTEvent. target. content. Например, следующий код устанавливает горизонтальной позиции загруженного элемента значение 100:

private function initListener (e;Event):void { e. target. content. x = 100;

}

При обращении к загруженным элементам следует помнить, что, поскольку элемент не добавляется в свой объект Loader до тех пор, пока процесс загрузки данного элемента не будет успешно завершен, вызов метода o6beKTLoader. getChi 1 dAt (0) до начала операции загрузки приведет к ошибке.

Руководство по actionscript. часть 6, стр. 009

Напомним, что элемент растрового изображения не добавляется в свой объект Loader до тех пор, пока не будет полностью загружен внешний файл. Элемент SWF-файла не добавляется в свой объект Loader до тех пор, пока не будут получены все элементы и классы для первого кадра, включая основной класс SWF-файла.

Более того, перед началом загрузки переменная content содержит значение nul 1. Это демонстрирует следующий код:

// Начинаем загрузку

var loader:Loader = new Loader( );

1oader.1oad(new URLRequest(«sunset. j pg»));

// Сразу же пытаемся обратиться к загружаемому элементу. // не дожидаясь завершения загрузки

traced oader. getChi 1 dAt (0)): // RangeError. Ошибка #2006:

// The supplied index is out of bounds. // (Указанный индекс выходит за пределы.)

tracedoader. content); // Выводит: null

Даже если операция загрузки началась, но элемент не был успешно загружен, обращение к переменной content или вызов метода getChildAt (0) приведет к следующей ошибке:

Error: Error #2099: The loading object is not sufficiently loaded to provide this information.

Руководство по actionscript. часть 6, стр. 010

На русском языке она будет выглядеть так: Загружаемый объект не был успешно загружен для предоставления данной информации.

Снова повторим: не пытайтесь обращаться к загружаемому элементу до момента возникновения события Event. INI Т. На самом деле обратное также верно: перед тем как обратиться к родительскому объекту Loader, код в основном классе загруженного SWF-файла должен дождаться возникновения события Event. INIT. В частности, код в конструкторе основного класса загруженного SWF-файла не имеет доступа к родительскому объекту Loader. С другой стороны, код, помещенный в первый кадр временной шкалы загруженного SWF-файла (в среде разработки Flash), может обращаться к родительскому объекту Loader (до возникновения события Event. INIT).

Воспользуемся новыми знаниями по обращению к элементам на примере класса SunsetViewer. В листинге 28.4 показано, как обращаться к загруженному файлу sunset. jpg из функции-приемника события Event. INIT. Эта функция отображает высоту, ширину и угол поворота загруженного изображения с помощью методик обращения к элементу, рассмотренных в данном разделе.

Листинг 28.4. Обращение к загруженному элементу

package { import flash. display.*; import flash. net. URLRequest; import flash. events.*;

public class SunsetViewer extends Sprite { private var loader:Loader;

public function SunsetViewer ( ) { loader = new Loader( );

// Регистрируем приемник для события Event. INIT

1 oader. contentLoaderlnfо. addEventLi stener(Event. INIT, initListener);

var urlRequest:URLRequest = new URLRequest(«sunset. jpg»); 1oader.1oad(urlRequest);

}

// Приемник вызывается при возникновении события Event. INIT private function initListener (e:Event):void {

// Обращаемся к элементу тремя различными способами

trace(1oader. content. wi dth);

trace(1oader. getChi1dAt(0).hei ght);

trace(e. target. content. rotati on);

}

S$4

Чтобы для загруженного элемента использовать методы и переменные класса Bitmap, MovieClip или основного класса SWF-файла, следуйте методикам, описанным далее в разд. «Проверка типов на этапе компиляции для динамически загружаемых элементов».

Руководство по actionscript. часть 6, стр. 011

Отображение загруженного элемента на экране

Как только элемент будет готов к использованию, он также будет готов к добавлению в список отображения для дальнейшего вывода на экран. Чтобы добавить загруженный элемент в список отображения, мы используем метод экземпляра addChild ( ) класса DisplayOb j ectContainer, как и при добавлении любого другого отображаемого объекта в список отображения. В листинге 28.5 представлен код, который добавляет объект Bitmap, представляющий файл sunset. j pg, в основной класс приложения SunsetViewer.

Листинг 28.5. Добавление элемента в список отображения

package { import flash. display.*; import flash. net. URLRequest; import flash. events.*;

public class SunsetViewer extends Sprite { private var loader;Loader;

public function SunsetViewer ( ) { loader = new Loader( );

loader. contentLoaderInfo. addEventListener(Event. INIT. initListener); var urlRequest:URLRequest = new URLRequest(«sunset. jpg»); loader. load(urlRequest);

}

private function initListener (e:Event):void { addChilddoader. content); // Добавляем объект Bitmap

// в объект SunsetViewer

}

}

}

Как показано в листинге 28.5, добавление объекта загруженного элемента в новый объект DisplayObjectContainer автоматически приводит к удалению этого элемента из его исходного родительского объекта Loader. В качестве примера добавим новый код в метод initListener ( ) из листинга 28.5. Этот код проверяет, сколько дочерних объектов имеет объект loader до и после добавления загруженного элемента (sunset, jpg) в объект SunsetViewer. Обратите внимание, что после перемещения элемента объект loader не имеет дочерних отображаемых объектов.

Руководство по actionscript. часть 6, стр. 012

Private function initListener (e:Event):void { tracedoader. numChildren); // Выводит: 1 (единственным ребенком

// является элемент)

addChi1d(1oader. content);

tracedoader. numChildren); // Выводит: 0 (поскольку элемент был

// перемещен)

}

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

Класс Loader сам по себе является потомком класса DisplayOb j ect, поэтому он непосредственно может быть добавлен в любой объект DisplayOb j ectContainer. Снова модифицируем метод initListener ( ) из листинга 28.5. На этот раз мы добавим объект loader непосредственно в объект SunsetViewer. В результате этой операции мы неявно делаем объект Bitmap, представляющий файл sunset. jpg, правнуком объекта SunsetViewer.

private function initListener (e:Event):void { addChilddoader); // Добавляем объект loader и его дочерний элемент // в список отображения

}

Объект Loader фактически может быть добавлен в список отображения до начала операции загрузки. Когда операция загрузки отображаемого элемента будет завершена, этот элемент автоматически добавится в объект Loader и, как следствие, в список отображения. Данная методика продемонстрирована в листинге 28.6. Код из этого листинга добавляет объект loader в список отображения до начала операции загрузки файла sunset. jpg. После того как экземпляр файла sunset. jpg будет создан и проинициализирован, он будет добавлен в объект loader и, поскольку объект loader уже находится в списке отображения, появится на экране. Таким образом, нет надобности в приемнике события Event. INIT.

Руководство по actionscript. часть 6, стр. 013

Листинг 28.6. Добавление объекта Loader в список отображения

package { import flash. display.*; import flash. net. URLRequest;

public class SunsetViewer extends Sprite { private var loader.-Loader;

public function SunsetViewer ( ) { loader = new Loader( ); addChilddoader);

var urlRequest:URLRequest = new URLRequest(«sunset. jpg»); loader. load(urlRequest);

}

}

}

Следовательно, самый простой из возможных способов загрузить отображаемый элемент и отобразить его на экране можно представить следующим кодом:

var loader:Loader = new Loader( ); addChilddoader);

1 oader. 1 oad(new URLRequest (адресиШЭлемента));

Три предыдущие строки кода подходят для многих простых ситуаций, однако в тех случаях, когда управление загруженным элементом должно осуществляться независимо от его объекта Loader или когда длительность паузы перед отображением загруженного элемента должна определяться вручную, более подходящим является код, который был представлен ранее в листинге 28.5.

Руководство по actionscript. часть 6, стр. 014

Мы уже знаем, как загружать и отображать внешний элемент, но зачастую в процессе загрузки элемента между этими двумя операциями существует заметная задержка. Далее мы рассмотрим, как использовать класс Loaderlnfo для отображения хода выполнения операции загрузки.

Отображение хода загрузки

Чтобы отобразить ход загрузки элемента, мы должны выполнить четыре следующих обобщенных шага.

1. Перед загрузкой элемента создать графический индикатор хода загрузки (например, текстовое поле или «индикатор загрузки»).

2. После начала загрузки добавить индикатор хода выполнения в список отображения.

3. По мере загрузки элемента обновлять состояние индикатора хода выполнения (по большому счету, это делается для удобства пользователя).

4. Когда загрузка будет завершена, удалить индикатор хода выполнения с экрана.

Посмотрим, как применить описанные шаги на практике, добавив простой индикатор хода выполнения, который реализован на базе текстового поля, в наш класс SunsetViewer.

Начнем с создания в классе SunsetViewer новой переменной экземпляра progressOutput, которая ссылается на обычный объект TextField. Текстовое поле progressOutput будет отображать информацию о ходе загрузки, private var progressOutput:TextField;

Далее мы создадим в классе SunsetViewer два новых метода: createPro gresslndicator ( ) и load ( ). Первый метод создает объект TextField progressOutput. Мы будем вызывать метод createProgressIndicator ( ) из конструктора класса SunsetViewer. Рассмотрим этот код:

private function createProgressIndicator ( ):void { progressOutput = new TextField( ); progressOutput. autoSi ze = TextFi eldAutoSi ze. LEFT; progressOutput. border = true; progressOutput. background = true; progressOutput. selectable = false; progressOutput. text = «LOADING…»;

}

Второй метод добавляет объект progre s sOutpu t в список отображения и начинает загрузку элемента. Всякий раз, когда с помощью метода load ( ) инициируется загрузка, объект progressOutput помещается на экран; всякий раз, когда загрузка завершается, объект progressOutput удаляется с экрана. Данная архитектура позволяет классу SunsetViewer повторно использовать один и тот же объект TextField для отображения информации о ходе загрузки. Рассмотрим код для метода load ( ):

private function load (urlRequest:URLRequest):void { // Начинаем загрузку loader. load(urlRequest);

// Если объект progressOutput еще не является потомком данного объекта… if (lcontains(progressOutput)) {

// …добавляем его

addChild(progressOutput);

}

}

В процессе загрузки мы ожидаем возникновения события ProgressEvent. PROGRESS, которое свидетельствует о появлении новой порции данных файла sunset. jpg и предоставляет самую последнюю информацию о ходе загрузки. Всякий раз, когда возникает событие ProgressEvent. PROGRESS, мы обновляем объект progressOutput. Получателем данного события является объект Loaderlnfo нашего загружаемого элемента. Как мы уже знаем, обратиться к объекту Loaderlnfo элемента можно через переменную экземпляра contentLoader Inf о класса Loader. Таким образом, чтобы зарегистрировать приемник для получения уведомлений о возникновении события ProgressEvent. PROGRESS, мы используем следующий код:

1oader. contentLoaderInfо. addEventLi stener(ProgressEvent. PROGRESS,

progressListener);

В приведенном коде progressListener— это ссылка на функцию, которую мы хотим выполнять при возникновении события ProgressEvent. PROGRESS. В функцию progressListener передается объект ProgressEvent, переменные которого содержат следующую информацию:

? размер файла загружаемого элемента (bytesTotal);

? количество байтов, полученных до настоящего момента (bytesLoaded).



Полезные ссылки
Случайные записи
  • 10.03.2011">Руководство по actionscript. часть 4, стр. 038
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.48
  • 02.09.2010">Тенденции развития веб-дизайна.
  • 15.02.2014">Как установить розетку?
  • 17.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.10
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.43
  • 16.08.2010">Нужна ли публикация списка клиентов?
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 106
  • 24.01.2010">Плагины расширений для браузера Google Chrome
  • 10.03.2011">Руководство по actionscript. часть 4, стр. 020
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 137
  • 21.03.2011">Руководство по actionscript. часть 2, стр. 041
  • 25.02.2011">Руководство по actionscript. часть 6, стр. 095
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.148
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 072
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...