Рубрика: AS3

Flex Mojos - A Maven Flex Plugin

Недавно вышел новый Flex Mojos - A Maven Flex Plugin. Если вы собираетесь внедрять maven, рекомендую к нему присмотреться.

Сборка приложения использующего BlazeDS, Spring, Hibernate. очень хорошо описана в наборе статей (Flex, Spring and BlazeDS: the full stack! part 1, part2 , part3, part4)

Bookmark this article at

Постоянная ссылка 2008-07-03 10:18:53, от agahov Email , 21 слов, Рубрики: Flex, AS3, maven , 2 комментариев »

Flex + Maven часть1

Для сборки flex c помощью maven необходимо произвести следующие действия:
- установить MAVEN
- установить flex sdk
- создать файл проекта pom.xml
- настроить среду
- создать структуру проекта и Main.mxml
- запустить maven

Создание файла проекта pom.xml
плагин для сборки swf/swc http://www.israfil.net
пример pom.xml для flex

XML:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
    <name>test-flex-swf</name>
    <groupid>test</groupid>
    <artifactid>test-flex-swf</artifactid>
    <version>1.0</version>
    <modelversion>4.0.0</modelversion>
    <description>test build flex with maven.
    see: </description>">http://riapriority.com/blogs/agahov.php</description>
 
    <packaging>swf</packaging>
 
  <properties>
                <flex .home>C:/FLEX_HOME/sdk/2.0.1</flex>
      </properties>
    <build>
        <plugins>
            <plugin>
                <groupid>net.israfil.mojo</groupid>
                <artifactid>maven-flex2-plugin</artifactid>
                <extensions>true</extensions>
                <configuration>
        <flexhome>${flex.home}</flexhome>
                    <mainmxmlfile>Main.mxml</mainmxmlfile>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Настройка среды
- flex.home в pom.xml должна ссылаться на flex sdk, которую вы хоти использовать для сборки

не забудте в файле $flex.home/frameworks/flex-config.xml отредактировать следующую строку:
winFonts.ser - для windows
macFonts.ser - для MAC

XML:

<flex -config>
        <compiler>
                <fonts>
                        <local -fonts-snapshot>---Fonts.ser</local>
                </fonts>
        </compiler>
</flex>

Cтруктура проекта
project-name/pom.xml
project-name/src
project-name/src/main/
project-name/src/main/flex
project-name/src/test
project-name/src/main/flex/Main.mxml

Main.mxml может быть таким:

XML:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
  <![CDATA[
    import mx.controls.Alert;
    
    private function start():void
    {
      Alert.show("hi maven!");
    }
  ]]>
</mx:Script>
 
  <mx:Button click="start()"/>
</mx:Application>

Сборка проекта с помощю maven
для сборки проекта зайдите в папку [project-name] и выполните команду: mvn pakage

исходники

Bookmark this article at

Постоянная ссылка 2007-11-27 11:00:10, от agahov Email , 325 слов, Рубрики: Flex, AS3, maven , 4 комментариев »

Maven

MAVEN.
философия maven

Цели Maven
- Сделать процесс сборки лёгким
- Обеспечить унифицированную систему сборки
- Предоставить качественную информацию о проекте
- Дать руководство о лучших практиках разработки
- Обеспечить прозрачный переход к новым возможностям.

статья на русском языке
cтруктура стандартного проекта.

Bookmark this article at

Постоянная ссылка 2007-11-23 13:21:30, от agahov Email , 4 слов, Рубрики: AS3 , Оставить комментарий »

Конференция User Experience

8-10 ноября прошла конференция User Experience. Это направление охватывает создание и использование продукта в целом. Основная цель User Experience - полезность (valuable) продукта для конечного пользователя.
Доклады, которые хотелось бы выделить.

Bookmark this article at

Постоянная ссылка 2007-11-12 23:11:04, от agahov Email , 173 слов, Рубрики: AS3 , Оставить комментарий »

Клонирование объектов утилитой ObjectUtil.copy

Нам понадобилось клонировать объект. Для этого в as3 можно использовать утилиту ObjectUtil.copy. Метод ObjectUtil.copy(obj) возвращает копию исходного объекта obj. Это замечательно работает для невизуальных объектов.
Пример:

  1. package com.test
  2. {
  3.         public class TestClass
  4.         {
  5.                 public var index : int = 100;
  6.         }
  7. }
  8.  
  9. ...
  10. var testObject:TestClass = new TestClass();
  11. testObject.index = 98;
  12. var cloneTestObject : Object = ObjectUtil.copy(testObject);
  13. trace(“cloneTestObject.index : ” + cloneTestObject); // cloneTestObject.index : 98
  14. ...

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

  1. ...
  2. var testObject:TestClass = new TestClass();
  3. testObject = 99;
  4. var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
  5. trace(index: ”+  cloneTestObject.index);
  6. ...

После некоторых исследований и подсказки Константина Ковалёва, находим метод flash.net.registerClassAlias. Который и решает проблему:

  1. ...
  2. var testObject:TestClass = new TestClass();
  3. registerClassAlias(getQualifiedClassName(testObject), TestClass);
  4. var cloneTestObject : TestClass = ObjectUtil.copy(testObject) as TestClass;
  5. ...

Для тех, кто хочет докопаться до сути процесса. В справке по registerClassAlias написано: «LocalConnection, ByteArray, SharedObject, NetConnection and NetStream are all examples of classes that encode objects in AMF.» Так как метод ObjectUtil.copy, использует ByteArray, то наш результирующий объект кодируется в формат AMF. Для восстановления класса объекта, используется функция flash.net.registerClassAlias.

Bookmark this article at

Постоянная ссылка 2007-05-08 11:30:56, от agahov Email , 654 слов, Рубрики: Flex, AS3 , 4 комментариев »

Решение проблемы наследования от Point.

Проблема:
Допустим, сделал я интерфейс IVector:

  1. interface IVector{
  2. function get x () : Number;
  3.  …
  4. }

Есть у меня класс утилита, который работает с этим интерфейсом:

  1. class VectorMath{
  2.   public function calc(v:IVector):IVector
  3.   {
  4.   …
  5.   }
  6. }

Кульминация - нужно сделать реализацию IVector:

  1. class Vector  implements IVector
  2. {
  3.   private var _x  : Number;
  4.   public function get x () : Number
  5.   {
  6.         return _x;
  7.   }
  8. }

Если присмотреться к классу Vector, становиться понятно, что он очень похож на Point.
Что же делать, ведь в данной реализации наследовать Vector от Point нельзя. Включать Point в Vector тоже нехорошо, потому как мы потеряем поведение Point. И для всех системных утилит принимающих Point, придется делать преобразование.

Решение:
Перепишем интерфейс IVector:

  1. interface IVector
  2. {
  3.   function get i () : Number;
  4.  
  5. }

И реализация IVector будет иметь следующий вид:

  1. class Vector  extends   Point implements IVector
  2. {
  3.   public function get i () : Number
  4.   {
  5.         //это не опечатка :)
  6.         return super.x;
  7.   }
  8. }

Вот такая радость:). Сегодня придумал. Если вы увидели недостатки данного решения, очень прошу поделиться.

Bookmark this article at

Постоянная ссылка 2007-03-28 22:40:51, от agahov Email , 560 слов, Рубрики: AS3 , 5 комментариев »

Публичные переменные в классе flash.geom.Point

Дополнение к посту «Публичные переменные это зло… »
Постараюсь более подробно раскрыть проблему реализации системного класса flash.geom.Point.

Изучим структуру flash.geom.Point:

  1. var myTestPoint : Point = new Point(9,9);
  2. trace(describeType(myTestPoint));

в данные момент меня интересуют две строчки, которые говорят что свойства x, y класса flash.geom.Point, описаны как публичные переменные


variable name="x” type="Number”

variable name="y” type="Number”

какие проблемы это вызывает?

Отсутствует возможность переопределить данные свойства в классе потомке.

Пример 1:

  1. Point;
  2.  
  3.         public class MyPoint extends Point
  4.         {
  5.                
  6.                 public function set x (v:Number)
  7.                 {
  8.                         x = v;
  9.                 }
  10.         }
  11. }

error: 1024: Overriding a function that is not marked for override.

Пример 2:

  1. package
  2. {
  3.         import flash.geom.Point;
  4.  
  5.         public class MyPoint extends Point
  6.         {
  7.                
  8.                 public override function set x (v:Number)
  9.                 {
  10.                         x = v;
  11.                 }
  12.         }
  13. }

error: 1023: Incompatible override.

Следовательно для реализации, например, интерфейса IPoint

  1. package
  2. {
  3.         public class IPoint
  4.         {
  5.                
  6.                 function set x (v : Number) : void;
  7.                 function get x () : Number;
  8.                
  9.                 function set y (v : Number) : void;
  10.                 function get y () : Number;
  11.                
  12.         }
  13. }

нельзя использовать использовать наследование

  1. public class MyPoint extends Point implements IPoint

придется использовать делегацию:

  1. package
  2. {
  3.         import flash.geom.Point;
  4.  
  5.         public class MyPoint implements IPoint
  6.         {
  7.                
  8.                 private var _point : Point;
  9.                
  10.                 public function MyPoint ()
  11.                 {
  12.                         _point = new Point();
  13.                 }
  14.                
  15.                 public function set x (v:Number):void
  16.                 {
  17.                         _point.x = v;
  18.                 }
  19.                 public function get x ():Number
  20.                 {
  21.                         return _point.x;
  22.                 }
  23.                
  24.                
  25.                 public function set y (v:Number):void
  26.                 {
  27.                         _point.y = v;
  28.                 }
  29.                 public function get y ():Number
  30.                 {
  31.                         return _point.y;
  32.                 }
  33.                
  34.         }
  35. }

Делегация в данном случае не оправдана, так как класс MyPoint нельзя будет использовать в методах работающих с Point. Вокруг стандартных методов придётся писать обёртки или использовать преобразование.

Пример преобразования:

  1. var Rect:Rectangle = new Rectangle(0,0, 100, 100);
  2. Rect.offsetPoint( new Point(myPoint.x, myPoint.y) );

Пример обертки:

  1. package
  2. {
  3.         import flash.geom.Rectangle;
  4.         import flash.geom.Point;
  5.  
  6.         public class MyRectangle extends Rectangle
  7.         {
  8.                
  9.                 public function offsetIPoint ( point : IPoint)
  10.                 {
  11.                         offsetPoint (new Point ( point.x, point.y ));
  12.                 }
  13.