Flash и Dreamweaver теперь можно использовать на платформе Linux. Это стало возможным благодаря выпуску новой версии CrossOver Office (позволяет выполнять Windows-приложения под Linux без необходимости приобретения Windows-лицензии).
Подробнее о Flash и Dreamweaver на платформе Linux(англ.).
Flashcast — это инструмент для "захвата" действий пользователя с экрана монитора, с возможностью компиляции полученных данных (включая перемещение мыши и клики) в готовый swf-файл. Инструмент подходит для производства туториалов, презентаций и т.п. Есть также возможность преобразования Powerpoint-презентаций в swf-формат. Производители Flashcast обещают также небольшой размер готового swf-файла. Недавно вышла новая версия этого приложения, 1.3.3. Подробнее о Flashcast 1.3.3.
Developer's SWF Guardian (DSG 1.0.0) — это компонент для защиты и лицензирования swf-файлов. Он позволяет устанавливать защиту на ваши файлы при передаче их вашим клиентам. Вам, как разработчику, предоставляется возможность создать различные уровни доступа (с возможными ограничениями по времени использования, в зависимости от того, какой выданной вами лицензией (ключом) располагает конечный пользователь или клиент).
Типичный пример: При первой передаче ваших swf-файлов клиенту вы создаете "демо-ключ", со сроком действия в 45 дней. Как только клиент заплатил вам, вы можете выдать ему ключ (лицензию) полного доступа с бесконечным сроком действия. А если же клиент захочет вас обмануть и не выплачивать деньги (так делать нехорошо), срок действия его демо-ключа истечет и — ваш защищенный флэш-клип будет выдавать сообщение об ошибке, работать в ограниченном режиме или вообще перестанет функционировать.
Пора приступать к испытаниям!
Сайт www.flashextensibility.com содержит массу полезных расширений для Flash MX 2004. Сайт поддерживается авторами книги "Extending Flash MX 2004" Keith Peters и Todd Yard (эта книга сейчас находится в процессе написания, а ее выход запланирован на середину ноября).
Еще одна ссылка: все расширения с www.flashextensibility.com и многие другие в одном флаконе. // via constantiner (спасибо :)
На авторском сайте www.podlob.com выложена масса экспериментов, как во Flash, так и в смежных областях. Хорошо сделано! // via Мой менеджер, спасибо ему!
http://www.macromedia.com/devnet/central/sdk/ // via den
Речь идет о новых ключевых словах try, catch и finally, появившихся в языке ActionScript 2.0. Применение try и catch довольно очевидно; вы "пытаетесь" (try) выполнить часть кода, и если в процессе его выполнения возникнут ошибки, вы можете "поймать" (catch) их соответствующим блоком catch, (в противном случае код продолжает нормально выполняться дальше). Не столь очевидно применение finally:
try
catch
finally
function myFunction () : Boolean { try { doSomething(); } catch (e:MyError) { doSomethingSafe(); } finally { return true; } }
return true
Вы наверняка уже слышали о новой политике работы а Активным Контентом (имеются в виду ActiveX-объекты веб-страниц) в броузере Internet Explorer. Новая политика имеет некоторые нюансы, содержащие потенциальную угрозу для нормального отображения Flash (ведь он является ActiveX-объектом). Сразу заметим, что Microsoft не виновата. Просто суд решил, что патенты Microsoft (ответчика) на использование ActiveX-технологии не столь убедительны, как патенты (не будем здесь рекламировать подлеца) истца. Последовали оргвыводы, и поэтому Microsoft в скором времени (начало 2004 года) выпустит создающее проблему обновление для Internet Explorer. Суть проблемы в том, что теперь перед загрузкой любого ActiveX-объекта (и Flash тоже) страницы броузер IE (и только он) будет спрашивать пользователя, можно ли загружать такой объект. Неприятный, но поправимый момент.
Нужно просто встраивать Flash в страницы таким образом, чтобы в html-коде он формально не выгдялел как ActiveX-объект. То есть отказаться от тэгов <object>, <embed>, и <applet>. А вместо этих тэгов использовать параметризованные вызовы функций из внешнего JavaScript-файла — чтобы таким образом вставлять ссылки на нужные ActiveX-объекты.
<object>
<embed>
<applet>
Есть и другой метод решения проблемы, позволяющий обойтись без внешнего скрипта. При этом в html-страницу включаются данные в формате base64 (бинарные данные), и для их правильного воспроизведения требуется обновленная версия Flash Player 7 (что-то здесь знакомо, не так ли?). Но большой минус этого метода в том, что контент должен сначала полностью загрузиться в страницу. Прелоадеры могут сильно пострадать! Хотя ведь можно сначала грузить легкий прелоадер, а потом уже через него — остальной контент. Простор для экспериментов.
Это один из немногих случаев, когда общественность была "за Microsoft".
Macromedia вместе с Microsoft разрабатывает технологии обхода "проблемы обновленного IE". В связи с этим на сайте Macromedia появились полезные материалы. Перечислим их:
Поговорим об этом подробнее
Серверные инструменты третьей группы совместимы с инструменты первых двух групп. Это важно, так как многие сайты имеют смешанную структуру, включающую и статические, и динамически генерируемые страницы. Основное назначение серверных инструментов — выявление критических мест. И без ручной работы не обойтись.
Инструменты поставляется с исходным кодом, где это нужно.
Вот простой пример кода, который в новом IE перестанет работать как раньше:
Чтобы все снова заработало в новой версии IE, замените этот код вызовом скрипта из внешнего файла. Стоит поинтересоваться также разделом на сайте MSDN msdn.microsoft.com/ieupdate/. Там можно скачать тестовые примеры, работающие в подавляющем большинстве случаев.
Если в странице присутствует один клип (или несколько, но не много), можно использовать следующее простое решение. Создайте для каждой страницы внешний JavaScript файл (JS), содержащий соостветствующий flash-контент. Если клипов в странице более одного, нужно внутри этого файла создавать уникальные функции для каждого клипа.
По шагам:
1. Создайте и сохраните JS-файл ос скриптом. В этом примере файл будем называть foo.js. Скрипт из этого файла при помощи функции document.write воссоздает в исходном HTML-файле насильственно устраненную оттуда конструкцию object/embed:
object/embed
2. Теперь подключите этот JavaScript к HTML-странице:
3. Замените все тэги <object> , <embed> , или <applet> вызовом соответствующего внешнего файла:
Немного сложнее, чем первый вариант, зато гибче. Внешний файл со скриптом содержит функции, вызывая которые вы можете включать в HTML-документ нужные вам ActiveX-объекты. При этом вы можете передавать функциям параметры, что и делает решение более гибким. Macromedia создала такие JS-Файлы для случая с включением в html-страницу Flash и Shockwave.
1. Сохраните эти JS-файлы в подходящей директории. В данном примере файлы называются AC_RunActiveContent.js и AC_Flash.js. Качать здесь(4Кб);
2. Подключите эти файлы ко всем страницам, содержащим ActiveX-контент. То есть Flash.
3. Замените все тэги <object> и <embed> соотвествующими вызовами функций (при этом передавая в функции параметры). Вот пример четырех вызовов: два для Flash и два для Shockwave:
AC_RunFlContent( "att1Name","att1Value", "att2Name","att2Value", ... "attnName","attnValue" );
AC_RunFlContentX( "att1Name","att1Value", "att2Name","att2Value", ... "attnName","attnValue" );
AC_RunSWContent( "att1Name","att1Value", "att2Name","att2Value", ... "attnName","attnValue" );
AC_RunSWContentX( "att1Name","att1Value", "att2Name","att2Value", ... "attnName","attnValue" );
Пары типа "att1Name","att1Value" соответствуют исходным параметрам типа movie, id, bgcolor и т.п.
att1Name
att1Value
movie
id
bgcolor
Например, вот так передается имя клипа:
(внешний JavaScript-код сам добавит расширение файла)
Если же вы передавали параметры в сам Flash-файл, что могло выглядеть как
То чтобы продолжать передаваь эти атрибуты, включите их как аргументы функции:
Файлы AC_RunActiveContent.js и AC_Flash.js производят проверки пар имя/значение на завершенность. Также автоматически добавляются атрибуты типа classid, codebase, mimeType и pluginspage. Если вы хоитие обновить значение одного из этих необходимых, нужно редактировать значение во внешнем JavaScript-файле AC_Flash.js. А в самой HTML-странице передавайте в качестве параметров только дополнительные аргументы.
Вот развернутый пример применения вышеописанной техники:
Оригинальный код
Заменяется на:
Да, тогдав все это не сработает. Но заметьте, что обычно такие пользователи отключают и ActiveX-объекты тоже. Так что они ничего не потеряют при обновлении броузера. Их опыт не изменится.
Дополнение от MSA (спасибо!): "Тут ты забыл упомянуть про чудесный html-тег - <noscript></noscript> В который можно вставить код в старом виде (<object>, <embed> и <applet>. ). И хотя пользователь получит идиотское сообщение, но это лучше чем ничего. Тем самым мы перестраховываемся по любому."
Паника была "несколько преждевременной". Перечисленные инcтрументы и/или ваши руки позволяют подготовиться к переходу на обновленную версию IE заранее. То есть никто из ваших пользователей не увидит те самые диалоговые окна с глупейшими вопросами типа "Можно ли включить Флэш?". Главное — вовремя проапгрейдить сайт, а на это есть достаточно времени. Конец Флэша снова отменяется :)
Студия FlashAnts выпустила новую версию своего плагина SWF2Video с полной поддержкой мувиклипов и ActionScript.
При помощи плагина можно производить прямой импорт из SWF-файлов в Adobe Premiere, зная, что ваши скрипты и мувиклипы пройдут через процедуру импорта без потерь. При этом также поддерживается альфа-канал, что позволяет накладывать swf-клипы поверх других видеоклипов. Плагин поддерживает версии Flash 4, Flash 5 и Flash MX. А поскольку большая часть контента Flash MX 2004 может быть экспортирована во Flash 6, плагин можно использовать и для ваших последних работ. Цена плагина — $149 (для двоих пользователей).
Читать подробности от разработчика (FlashAnts).
Автор: Joey Lott [http://www.person13.com/]
В первых двух частях [часть 1 | часть 2] мы рассматривали структуру и синтаксис классов в ActionScript 2.0. Мы узнали, как создавать классы в ActionScript 2.0, включая использование пакетов, членов класса с разными режимами доступа (public/private/static), а также геттеров и сеттеров. Теперь поговорим о наследовании (inheritance) и интерфейсах (interfaces).
public/private/static
Наследование связано с иерархичностью классов. Можно определить подкласс и суперкласс. Подкласс автоматически наследует всех членов суперкласса без необходимости их явного повторного определения. Это важное и полезное свойство классов, поскольку позволяет использовать высокий уровень абстракции. А высокий уровень абстракции ведет к высокой эффективности рабочего процесса, и чем сложнее проект, тем это заметнее.
Например, вы хотите создать класс Car, подобный тому, что мы создавали в предыдущих частях статьи. Ясно, что Автомобиль — это один из многих типов Машины, помимо Автомобилей существуют Вертолеты, Дрезины, Джипы, Терминаторы и т.д. Хотя Машины и отличаются друг от друга, у них есть много общего. Все вышеперечисленные машины могут иметь такие свойства, как "грузоподъемность" или "пробег" (для Самолетов — "пролет"). А если Машина еще и передвигается в пространстве, у нее есть методы для перемещения с заданной скоростью.
Car
Так вот, если вы создадите суперкласс Vehicle (т. е. "Машина"), то можно в него поместить все общие для машин характеристики (свойства и методы). При этом код будет написан только в одном месте, а использовать его можно будет во многих местах: во всех подклассах класса Машины. Для создания суперкласса не нужно быть чемпионом по программированию среди домохозяек (или домохозяинов). Просто берете и создаете суперкласс, как раньше создавали обычные классы. А вот чтобы наследовать от этого класса (иными словами, расширить его), потребуются новая техника. Довольно легкая в освоении.
Vehicle
В терминах ООП можно сказать, что подкласс расширяет (extends) суперкласс. В нашем примере подкласс Car расширяет суперкласс Vehicle. Чтобы Flash создал такую связь между ними, нужно при объявлении подкласса использовать ключевое слово extends:
extends
В случае с Автомобилем и Машиной получится приблизительно следующее:
Вы всего один раз говорите, что класс Car расширяет класс Vehicle, и получаете при этом в свое распоряжение все свойства и методы класса Vehicle, как будто бы они были определены в классе Car.
Часто возникает ситуация, когда в подклассе необходимо унаследовать метод суперкласса без каких-либо изменений в этом методе. В таких случаях в определением подкласса просто не нужно ничего делать с этими методами. Но во многих других случаях метод суперкласса может быть перекрыт — для реализации в данном методе особенностей подкласса. Это называется перекрытием (overriding) метода суперкласса, поскольку при этом подкласс определяет в себе собственную реализацию метода, которая перекрывает унаследованную, родительскую.
Перекрывать методы суперкласса можно по-разному:
Чтобы полностью перекрыть родительский метод, просто определите в классе-потомке метод с точно таким же именем, как и у родительского метода. Например, если у суперкласса есть метод типа:
Потом можно определить реализацию метода в подклассе, которая перекроет реализацию этого метода в суперклассе:
Это был первый подход.
Если же вы хотите реализовать в подклассе метод, который будет вызывать также свою реализацию в суперклассе, можете использовать ключевое слово super, чтобы ссылаться на суперкласс и явно вызывать его метод из метода подкласса. Например, пример с методом display() в таком случае можно переписать следующим образом:
super
display()
Затем, если из экземпляра подкласса вызвать метод display() подкласса, в панели Output увидим следующее:
Ссылку super можно использовать в любом месте подкласса. Например, вызов super() будет ссылаться на метод конструктора суперкласса. Это пригодится, если вы хотите, чтобы конструктор подкласса выполнял некоторые действия, уникальные для подкласса, но в то же время вы хотите вызывать конструктор суперкласса, передавая ему некие конкретные значения. Единственное предостережение: конструктор суперкласса должен всегда вызываться в первой строке конструктора подкласса, если вы вызываете его явно. В противном случае получите ошибку компиляции.
super()
Конец теории. Выполним упражнение. Создадим суперкласс Vehicle (Машина) и подкласс Car (Автомобиль). Если вы сделали упражнение из второй части данной статьи, то вам будет легко следить за мыслью.
Niva
Kukuruzniq
Plane
Интерфейсы — это просто. Это набор правил, в соответствии с которыми реализуется некий набор классов. Когда вы определяете класс, который следует правилам интерфейса, то говорят, что класс реализует (иногда на жаргоне говорят — "имплементит", от англ. "implements") интерфейс.
Какие правила определяются в интерфейсе? Интерфейс в ActionScript 2.0 сообщает Flash, какие методы должны реализоваться в классе, включая следующую информацию:
private
static
В интерфейсе недопустимы:
Затем можно реализовывать интерфейс в классе. При этом, кроме всего прочего, в классе должны реализовываться методы, объявленные в интерфейсе. В противном случае на этапе компиляции Flash выдаст сообщение об ошибке.
Не все разработчики схватывают на лету плюсы интерфейсов. На первый взгляд кажется, что это только лишняя неблагодарная работа. Ведь в самом интерфейсе нет функциональности, потому что в нем нет реализаций объявляемых в нем же методов.
Реальное величие интерфейсов видится с некоторого расстояния. если вы создаете один класс для одного приложения, то интерфейсы вам и не нужны. И не все классы обязаны реализовать интерфейс. Но если вы работаете в команде, а проект не маленький — тут интерфейсы приходят на выручку, помогая создавать основные вехи проекта, что повышает эффективность процесса не только на этапе разработки иерархии классов приложения, но также и на этапе применения этих классов.
Например, вы работаете в команде, которая создает классы Vehicle (Машина), Animal (Животное), Wind (Ветер) и Planet (Планета). В то время как у каждого из этих классов может быть собственный API, между ними есть и общее — все они способны двигаться. Если вы хотите реализовать движение в каждом из этих классов, можно создать интерфейс IMoveable, который будет реализовываться всеми этими классами. Интерфейс IMoveable будет содержать объявление метода move(), так что теперь каждый конкретный человек, работающий над реализацией конкретного класса, будет учитывать этот факт в процессе разработки и реализует метод move() в разрабатываемом им классе. Это большой плюс при командной работе. Когда вы создаете интерфейс и определяете, какие классы будут его реализовать, то потом все разработчики, работающие над классом, будут заранее знать, какие методы писать, и это облегчает стандартизацию API всех классов. Еще одно преимущество получает разработчик, использующий такой класс. Зная, какой именно конкретный интерфейс реализуется в классе, вы ужен знаете много о своем API.
Animal
Wind
Planet
IMoveable
move()
Один класс может реализовывать многочисленные интерфейсы. Поэтому интерфейсы часто используются как форма множественного наследования в языках, изначально не поддерживающих такой вид наследования. В ActionScript подкласс может наследовать только от одного суперкласса. Например, класс Car расширяет класс Vehicle, и следовательно не может расширять ни один другой класс. Но Car может реализовывать множественные интерфейсы (продолжая при этом наследовать от класса Vehicle.) Например, Car может реализовать интерфейсы типа IDrivable (автомобиль можно водить), IManufacturable (можно производить), ISellable (можно продать).
IDrivable
IManufacturable
ISellable
Рассмотрим пример объявления и определения интерфейса. Вы уже знаете синтаксис и структуру классов, так что нового здесь будет совсем немного.
Декларация (объявление) интерфейса выглядят почти идентично декларации класса. Единственное различие в том, что при объявлении интерфейса используется ключевое слово interface, вместо ключевого слова class. Например:
interface
class
В интерфейсе можно только объявлять методы, но не реализовывать их. Реализовываться методы будут в классах, реализующих интерфейс. В интерфейсе нельзя также объявлять свойства. Еще раз кратко перечислим то, что может и должно содержаться в интерфейсе:
Вот пример готового интерфейса IMoveable:
Как и классы, интерфейсы удобно хранить в пакетах. Например, можно упаковать IMoveable в пакет com.person13. В декларации интерфейса это выглядит вот так:
И также, как и классы, интерфейсы могут расширять друг друга Например, IDrivable может расширять IMoveable, вот как будет при этом выглядеть код:
После определения интерфейса можно указать, что некий класс реализует этот интерфейс. Для этого используется ключевое слово implements, за которым будет следовать список разделенных запятыми реализуемых интерфейсов. Например, если класс Vehicle реализует интерфейс IMoveable, то начало объявления класса будет выглядеть так:
implements
Конечно, при этом можно пользоваться импортом (как и с классами):
А вот класс Car реализует интерфейсы IDrivable, IManufacturable, и ISellable:
Когда класс реализует интерфейс, Flash будет проверять правильность этой реализации во время компиляции. И если какой-то метод пропущен или объявлен неверно, не так, как в интерфейсе, то Flash выдаст сообщение об ошибке.
Вот и разобрались. Комментарии приветствуются как никогда. Спасибо :]
1) Часто вместо "перекрытие" говорят "переопределение". Пусть это вас не смущает!
2) Не забывайте, что иногда вместо "реализовать" говорят "имплементить".
Программа FlashSlider обновлена до версии 1.3. Ее назначение — быстрое и ненавязчивое создание слайд-шоу с разнообразными переходными эффектами между слайдами. Подробности мы писали раньше: FlashSlider — инструмент для создания слайд-шоу.
С тех пор в программе произошли улучшения:
Совсем древнее: 17-20.09.2002, 23-30.09.2002, 01-04.10.2002, 07-11.10.2002, 14-19.10.2002, 20-26.10.2002, 27.10-02.11.2002, 04-08.11.2002, 11-16.11.2002, 18-23.11.2002 25-30.11.2002, 02-07.12.2002, 09-14.12.2002 Сайт заработал 17.09.2002