Блог от AS3Coder'a о JavaScript, HTML, CSS... и немного о Flash.

пятница, 28 мая 2010 г.

SVG vs Flash

Работая над очередным проектом столкнулся с необходимостью отображения Flash-приложения на мобильных устройствах. Если на Android в ближайшем будущем поддержка Flash Player'a ожидается, то как быть с остальными устройствами?

Ответ пришел незамедлительно: "SVG + Javascript".

От HTML-кодеров я часто слышу резкие изречения сравнения Flash и SVG как технологий, в пользу второго. О том, что SVG не требует плагинов и ничем не уступает Flash'y. На нем можно рисовать векторные изображения, писать код на JavaScript, делать анимацию и многое другое.

Уже не первый год SVG ставят в конкуренты к Flash'y, хают одно и лелеют другое. И так как у меня появилась такая возможность поработать и с тем и с другим, я хочу сделать небольшой обзор.

Является ли SVG и Flash конкурентами?

Ответ: «Нет». Поясню.

На мой взгляд SVG не является конкурентной технологией. Flash имеет ряд возможностей, которых нету в первом. К такому мнению я пришел начав миграцию моего Flash-проекта на SVG. Всё-таки кросс-платформенность для flasher'ов немного непривычно.

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

Вообще выбор технологии, должен зависеть от задачи. Например у меня задача стояла, чтобы web-приложение одинаково работало и выглядело на домашних копьютерах и на мобильных устройствах. И теперь используя две технологии (вместо какой-то одной) моё приложение работает на всех устройствах.

Flash и SVG - это скорее друзья :)

Мне не составило особого труда переписать моё приложение с ActionScript на JavaScript, который используется в SVG. Не составило труда перенести статичную графику. Вообще всё прошло гладко.

Обе технологии дополняют друг друга. Недостатки Flash'a можно с легкостью заменить преимуществами SVG. И наоборот. Использование обеих технологий придаст вашему проекту уникальную гибкость.

Вот, что я вынес для себя:


Flash SVG
Преимущества
  • Работа с камерой и микрофоном
  • Работа со звуком и видео
  • Загрузка и выгрузка файлов
  • Не требует дополнительных плагинов
  • Работает во всех мобильных устройствах
Недостатки
  • Требует плагин Adobe Flash Player
  • Не поддерживается большинством мобильных устройств
  • Не работает в Internet Explorer


Вывод

Не нужно привязываться к технологиям.

P.S.

Точно такая же ситуация и с HTML5... Но об этом в другой раз.
 

четверг, 20 мая 2010 г.

Создание Excel-документа на ActionScript 3.0

Недавно в одном из моих проектов при работе с различными схемами и диаграммами появилась необходимость экспорта данных в распространенный и удобочитаемый формат. Выбор автоматически пал на документы Microsoft Excel. Оказалось:
Начиная с 10-ой версии Flash Player можно собирать Excel-документы без участия сервера.
с чем хочу с вами поделится.

Немного теории.

В качестве Excel-документов я рассматриваю документы созданные в Microsoft Excel 2007 с расширением .xlsx. Именно с этой версии Microsoft открыла свой формат электронных таблиц. И теперь - это не файл с бинарными записями, а .zip-архив с набором .xml-документов.

Таким образом для создания .xlsx-документов нам необходимо записать данные в .xml-документы, затем собрать их в .zip-архив и в завершении заменить его расширение на ".xlsx".

Что мы имеем во Flash Player?
  • Полноценная работа с xml-разметкой (пакет классов flash.xml). Мы можем с легкостью записывать наши данные в .xml-документы.
  • Работа с бинарными данными (класс flash.utils.ByteArray), с помощью которой можно организовать сборку zip-архива.
  • Сохранение бинарных данных на компьютер пользователя (класс flash.net.FileReference).
Всё что нам необходимо, мы имеем. Поэтому перейдем к практике.

Запись данных в XML

Первым делом нужно разобраться с содержимом .xlsx-документа, а именно с .xml-документами. Для этого я в Microsoft Excel 2007 создал новый документ, сделал некоторые записи,



сохранил, поменял расширение на .zip и увидел такую вот структуру с каталогами и файлами.



Свои записи (Ivan, Ivanov, Ivanovich) я нашел в файле xl/sharedString.xml. Насколько я понял, это хранилище для текстовой информации.
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="3" uniqueCount="3">
  <si><t>Ivanov<t><si>
  <si><t>Ivan<t><si>
  <si><t>Ivanovich<t><si>
<sst>
Далее я открыл файл xl/worksheets/sheet1.xml и действительно в описание столбца увидел ссылку (а точнее индекс) на содержимое из xl/sharedString.xml.
...
<row r="1" spans="1:3">
  <c r="A1" t="s"><v>0<v><c>
<row>
...
Для начала этой информации нам достаточно.

Рассматривать подробно все возможности записи .xml-документов внутри .xlsx-файлов я не буду. Ознакомится с ними можно прочитав книгу "OpenXML. Кратко и доступно", автором которой является Воутер Ван Вугт.

Скажу только то, что благодаря такой открытой структуре .xlsx-документа, вы сможете с легкостью записывать не только текстовую информацию, но и изображения, диаграммы и все остальные объекты Microsoft Excel.

Сборка XML-документов в ZIP-архив

Теперь когда с записью в .xml-документы разобрались давайте попробуем их собрать в архив. Писать архиватор мы не будем, используем готовый. Меньше всего проблем у меня возникло с библиотекой FZip, так что используем её.
...
var zip:FZip = new FZip();
zip.addFile("_rels/.rels", Templates._RELS);
zip.addFile("docProps/app.xml", Templates.APP_XML);
zip.addFile("docProps/core.xml", Templates.CORE_XML);
zip.addFile("xl/_rels/workbook.xml.rels", Templates.WORKBOOK_XML_RELS);
zip.addFile("xl/theme/theme1.xml", Templates.THEME1);
zip.addFile("xl/worksheets/_rels/sheet1.xml.rels", Templates.SHEET1_XML_RELS);
zip.addFile("xl/worksheets/sheet1.xml", Templates.SHEET1_XML);
zip.addFile("xl/sharedStrings.xml", Templates.SHARED_STRING_XML);
zip.addFile("xl/styles.xml", Templates.STYLES_XML);
zip.addFile("xl/workbook.xml", Templates.WORKBOOK_XML);
zip.addFile("[content_types].xml", Templates.CONTENT_TYPES_XML);
//
var brr:ByteArray = new ByteArray();
zip.serialize(brr, true);
...

Сохранение на компьютер пользователя

Сохранить, собранный архив на локальный диск пользователя, можно при помощи класса flash.net.FileReference. Начиная с 10 версии FlashPlayer'a у этого класса появился метод save, который перед сохранением показывает диалоговое окно с выбор место сохранения. Вызываем его и в первом параметре пишем имя сохраняемого файла по умолчанию с расширением "xlsx".
...
var file:FileReference = new FileReference();
file.save("excel_file.xlsx", brr);
...

Пример


     

понедельник, 26 апреля 2010 г.

Создание AIR-приложения во FlashDevelop

Что такое AIR?


Adobe® AIR™ - кросс-платформенная рабочая среда, предоставляющая разработчикам возможность использования технологий HTML, Ajax, Adobe Flash® и Adobe Flex® для создания многофункциональных настольных интернет-приложений.
Подробные ответы можно найти на сайте Adobe.

Если проще, то с помощью Adobe AIR мы можем заставить своё AS3-приложение работать как полноценная настольная программа с доступом к файловой системе, с работой с базами данных SQL, а также другими возможностями, которых не хватает во Flash Player.

Посмотреть полный список дополнительных возможностей можно в справочнике по языку ActionScript 3.0. Классы, которые помечены иконкой - логотипом технологии, предназначены для AIR-приложений и являются отличным дополнением к тем, что мы используем во Flash Player.



Создание AIR-приложений

Немного теории

AIR-приложения можно собирать использую разные технологии: Ajax (Javascript + HTML) и ActionScript (Flash и Flex). В последней версии FlashDevelop используется вариант с ActionScript и для этого имеется три типа проекта AIR AS3 Projector, AIR Flex 3 Projector и AIR Flex 4 Projector. Мы рассмотрим проект с чистым ActionScript 3.0.

Создаем новый проект "My First AIR Application":

AirIcon12x12

Во вкладке "Project", мы увидим директорию проекта.

2010-04-26 21 45 52

С директориями "bin", "lib" и "src" мы уже знакомы из раннего поста. А вот остальные файлы на не известны. Остановимся на них по-подробнее.

AIR_readme.txt - текстовый файл с инструкцией на английском языке, о том как компилировать приложение. По сути всё-то, о чем я буду говорить ниже :)

application.xml - файл с настройками приложения. По умолчанию файл имеет минимум настроек - это имя идентификатор, версия, имя, описание, авторство и внешний вид окна приложения. Также здесь можно задать иконку приложению, причем разных размеров:

<icon>
  <image16x16>icons/smallIcon.png</image16x16>
  <image32x32>icons/mediumIcon.png</image32x32>
  <image48x48>icons/bigIcon.png</image48x48>
  <image128x128>icons/biggestIcon.png</image128x128> 
</icon>
можно указать директорию установки приложения и директорию в списке программ:

<installFolder>Example Co/Hello World</installFolder>
<programMenuFolder>Example Co</programMenuFolder>
можно разрешить устанавливать приложения из браузера:

<allowBrowserInvocation>false</allowBrowserInvocation>
можно привязать к приложению файлы с заданным расширением, задав им свои иконки:

<fileTypes>
    <fileType>
        <name>adobe.VideoFile</name>
        <extension>avf</extension>
        <description>Adobe Video File</description>
        <contentType>application/vnd.adobe.video-file</contentType>
        <icon>
            <image16x16>icons/avfIcon_16.png</image16x16>
            <image32x32>icons/avfIcon_32.png</image32x32>
            <image48x48>icons/avfIcon_48.png</image48x48>
            <image128x128>icons/avfIcon_128.png</image128x128>
        </icon>
    </fileType>
</fileTypes>
полный список настроек смотрите в официальной справке от Adobe.

CreateCertificate.bat - исполняемый файл для создания само подписанного цифрового сертификата. Описывать сертификацию приложения в рамках данного материала, я не буду, постараюсь позже написать об этом отдельный пост. Скажу только одно: при установки приложения на компьютер у пользователя появляется диалоговое окно, с пугающими сообщениями:

2010-04-26 21 54 18

Избежать этих сообщений можно использую сертификат выданный доверенным центром сертификации, таких как VeriSign or Thawte. Подробнее о сертификации также есть в официальной справке.



PackageApplication.bat - исполняемый файл для сборки готового приложения. Подробнее здесь.


Теперь практика

В качестве примера напишем приложение, которое выводит на экран и затем пишет все доступные данные о плеере и системе пользователя (данные статического класса flash.system.Capabilities) в текстовый файл Capabilities.txt на рабочем столе.

Открываем файл основного класса Main.as и пишем туда:

/**
 * ...
 * @author AS3Coder
 */
package 
{
  /**
   * Импорт классов
   */
  import flash.filesystem.File;
  import flash.filesystem.FileStream;
  import flash.filesystem.FileMode;
  //
  import flash.display.Sprite;
  import flash.display.StageAlign;
  import flash.display.StageScaleMode;
  import flash.system.Capabilities;
  import flash.events.Event;
  import flash.text.TextField;
  import flash.text.TextFormat;
  import flash.text.TextFieldAutoSize;
  import flash.utils.ByteArray;
  
  /**
   * Основной класс приложения
   */
  public class Main extends Sprite 
  {
    /**
     * Конструктор
     */
    function Main():void 
    {
      addEventListener(Event.ADDED_TO_STAGE, onAddToStage, false, 0, true);
    }
    /**
     * Метод создает текстовое поле, заполняет его данными.
     * Открывает поток и записывает содержимое 
     * тектового поля в файл.
     */
    private function create ():void
    {
      var str:String;
      var txt:TextField;
      var fil:FileStream;
      //
      str = "";
      str += "navHardwareDisable: " + Capabilities.avHardwareDisable;
      str += "\nhasAccessibility: " + Capabilities.hasAccessibility;
      str += "\nhasAudio: " + Capabilities.hasAudio;
      str += "\nhasAudioEncoder: " + Capabilities.hasAudioEncoder;
      str += "\nhasEmbeddedVideo: " + Capabilities.hasEmbeddedVideo;
      str += "\nhasIME: " + Capabilities.hasIME;
      str += "\nhasMP3: " + Capabilities.hasMP3;
      str += "\nhasPrinting: " + Capabilities.hasPrinting;
      str += "\nhasScreenBroadcast: " + Capabilities.hasScreenBroadcast;
      str += "\nhasScreenPlayback: " + Capabilities.hasScreenPlayback;
      str += "\nhasStreamingAudio: " + Capabilities.hasStreamingAudio;
      str += "\nhasStreamingVideo: " + Capabilities.hasStreamingVideo;
      str += "\nhasTLS: " + Capabilities.hasTLS;
      str += "\nhasVideoEncoder: " + Capabilities.hasVideoEncoder;
      str += "\nisDebugger: " + Capabilities.isDebugger;
      str += "\nisEmbeddedInAcrobat: " + Capabilities.isEmbeddedInAcrobat;
      str += "\nlanguage: " + Capabilities.language;
      str += "\nlanguages: " + Capabilities.languages;
      str += "\nlocalFileReadDisable: " + Capabilities.localFileReadDisable;
      str += "\nmanufacturer: " + Capabilities.manufacturer;
      str += "\nmaxLevelIDC: " + Capabilities.maxLevelIDC;
      str += "\nos: " + Capabilities.os;
      str += "\npixelAspectRatio: " + Capabilities.pixelAspectRatio;
      str += "\nplayerType: " + Capabilities.playerType;
      str += "\nscreenColor: " + Capabilities.screenColor;
      str += "\nscreenDPI: " + Capabilities.screenDPI;
      str += "\nscreenResolutionX: " + Capabilities.screenResolutionX;
      str += "\nscreenResolutionY: " + Capabilities.screenResolutionY;
      str += "\nserverString: " + Capabilities.serverString;
      str += "\nversion: " + Capabilities.version;
      //
      txt = new TextField()
      txt.selectable = false;
      txt.multiline = true;
      txt.defaultTextFormat = new TextFormat("Courier New", 12);
      txt.autoSize = TextFieldAutoSize.LEFT;
      txt.text = str;
      txt.x = 10;
      txt.y = 10;
      addChild(txt);
      //
      fil = new FileStream();
      fil.open(new File(File.desktopDirectory.nativePath + "/Capabilities.txt"), FileMode.WRITE);
      fil.writeUTFBytes(str.split("\n").join("\r\n"));
      fil.close();
    }
    /**
     * Метод обрабатывает событие добавления 
     * основного клипа приложения на сцену.
     */
    private function onAddToStage (e:Event):void
    {
      removeEventListener(Event.ADDED_TO_STAGE, onAddToStage, false);
      //
      stage.scaleMode = StageScaleMode.NO_SCALE;
      stage.align = StageAlign.TOP_LEFT;
      //
      create();
    }
  }
}
Перейдем к настройкам. Попробуем задать окну приложения произвольную иконку. Для этого добавим в директорию “bin” файл изображения иконки, например такую cog . Теперь откроем файл с настройками application.xml и допишем туда блок:

<icon>
  <image16x16>cog.png</image16x16>
</icon>
результат мы увидим позже.

Теперь, когда код написан, добавлены настройки, можно переходить к сборке приложения. И для этого нам необходим сертификат подлинности. Для создания сертификата у нас имеется файл CreateCertificate.bat. Но прежде чем запустить сценарий исполнения, необходимо открыть содержимое файла и на 9 строке поменять путь до Flex SDK/bin на действительный. Узнать его можно в настройках FlashDevelop:

2010-04-27 21 50 50

После выполнения сценария в директории проекта появится файл самоподписанного сертификата:

2010-04-27 21 52 09

Для окончательной сборки AIR-приложения запускаем PackageApplication.bat. И увидим ошибку:

2010-04-27 21 54 47

также как в файле CreateCertificate.bat нужно прописать действительный путь до Flex SDK. Пробуем еще раз. Вводим пароль. И если все правильно, то в директории проекта появляется новая папка “air”, в которой лежит наше приложение.

2010-04-27 21 58 26

Для запуска .air-файлов на компьютере пользователя необходим плеер Adobe AIR. Если его нет, то нужно его поставить.

Попробуем запустить полученный .air-файл. Мы увидим стандартный установщик с минимум настроек. После установки мы увидим ярлык нашего приложения. Теперь наше AIR-приложение, является полноценной настольной программой. Запустив его, мы увидим в окне приложения ту иконку, которую мы указывали в настройках, а также файл Capabilities.txt на рабочем столе, который создала наша программа.

2010-04-27 22 03 04

Вот так легко и быстро мы (web-разработчики) теперь можем создавать полноценные настольные программы.



Смотрите также:

Поиск по блогу

Обо мне



Farid Shamsutdinov (AS3Coder)
Russia, Tatarstan, Kazan
as3coder@gmail.com

Подробнее...

Постоянные читатели

© 2014 Farid Shamsutdinov. При копировании материалов, ссылка на источник обязательна. Технологии Blogger.