Rss Feed

Tutoriaux Adobe Flash Collaborative Services

Le site Flex tutorial a mis en ligne une série d’articles sur l’utilisation d’Adobe Flash Collaborative Services (AFCS) anciennement appelé Cocomo, permettant de s’adonner aux joies des outils collaboratifs. On y retrouve toutes les informations utiles permettant de construire son application basée sur ce service, et ainsi gagné un temps loin d’être négligeable lorsque l’on doit mettre en place ce type de structure.

A consulter de toute urgence sur ce lien

Contourner l’erreur de parse des && dans le mxml

Voici une petite astuce d’écriture pour éviter de devoir inverser les conditions lorsqu’on les place dans du code mxml. En effet, Flex ne supporte pas que l’on ait les opérateur && dans du code mxml.

Le code : <mx:Label text= »matsiya » visible= »{condition1 && condition2} » /> devrait fonctionner dans la logique, puisque <mx:Label text= »matsiya » visible= »{condition1 || condition2} » /> fonctionne très bien, mais ce n’est pas le cas.

On pourrait certainement chercher pourquoi derrière il refuse cette compilation car le code mxml n’étant autre que du code as3, la raison doit se trouver là dedans. Néanmoins, ce problème d’écriture résulte souvent dans une prise de tête.

Pour le contourner, il suffit alors d’écrire sous la forme suivante :

<mx:Label text= »matsiya » visible= »{(int(condition1)*int(condition2))==1} » />

Cela rend le code un peu moins lisible, mais est terriblement efficace.

« Smoother » une vidéo en flex

Actuellement en pleine préparation d’un produit tournant autour de la vidéo (plus d’informations très bientôt), nous avons rencontré un problème que beaucoup de développeurs flex ont surement rencontré. En effet, quand il s’agit d’afficher une vidéo dans un player qui n’est pas à ses dimensions et principalement quand il s’agit d’agrandir la vidéo, cette dernière se retrouve plombée par un fort aliasing. Il s’agit de petits crénaux qui apparaissent sur les courbes des objets affichés, qui rendent la vidéo pixélisée. Cela est particulièrement visible quand on affiche en plein écran la dite vidéo.

Alors comment faire pour anti-aliaser tout cela ?

La classe Video propose une option « smoothing », permettant de corriger ce problème. Mais pour ceux d’entre vous qui souhaitent utiliser la classe VideoDisplay, vous allez vous rendre compte qu’il n’est pas possible d’accéder à l’instance de la classe Video. En fait, il existe un moyen assez simple d’y accéder :

Supposons que le VideoDisplay possède l’id « vidDisplay », il suffit de faire « vidDisplay.mx_internal::videoPlayer.smoothing = true » pour activer l’anti-aliasing.

On constate une légère hausse de l’activité du processeur, surtout quand la vidéo affichée est grande, mais rien de bien catastrophique.

Voici un exemple de ce que cela peut donner, avec le code source.

Flex Smoothing Video

ComboBox flex : rowCount

Il y a quelques jours, nous vous parlions de la propriété rowCount des ComboBox dans Flex, permettant de définir le nombre d’éléments à afficher dans la liste déroulante.

Et bien voici un exemple avec son code source utilisant cette propriété. Vous définissez d’abord le nombre d’éléments de la ComboBox, puis le nombre à afficher dans la liste déroulante, et vous visualisez le résultat juste en dessous dans la ComboBox.

ComboBox rowCount

Documentation AS3 sur iPhone

Mike Chambers a créé une application pour l’iPhone permettant de consulter la documentation de l’API AS3 (FP10, Air 1.5, Flex 3.2). Cette application permet d’accéder beaucoup plus rapidement aux contenus de la documentation que par la recherche traditionnelle via Google ou sur le site d’Adobe.

Plus d’informations sur le blog de Mike Chambers

Présentation de SOFA un ORM Air pour SQLite

Nous sommes en train de développer en interne un ORM SQLite pour Adobe AIR : SOFA. Nous avons décidé de le passer en open source prochainement. Il supporte le « nested fetching » , les delete et save en cascade , les formulas, les clefs composites, les relations one to one, one to many et many to many, l’héritage etc … Ce n’est pas une implémentation du pattern ActiveRecord : nous avons choisi de nous rapprocher plus d’un ORM comme hibernate qui même si il nécessite plus de configuration (bien plus) permet une plus grande souplesse dans de gros projets. Il n’y a pas de support pour les conventions pour l’instant mais pourquoi pas dans une prochaine release. Voilà un exemple de SofaQL :

Family family = sofaManager
  .createQuery("load Family <=> f where f.id = :id; fetch Family.people")
  .setIntegerArgument("id", 1)
  .execute();

Donnera :

Handle load : load Family
executing :
 select Family.ID as Family_0_id, Family.NAME as Family_0_name
 from FAMILY Family
 where Family.ID = 1
fetching : fetch Family.people
executing :
 select Person.ID as Person_0_id, Person.NAME as Person_0_name,
 Person.ID as Person_0_id, Person.FAMILY_ID as Person_0_familyId
 from ( ( People Person inner join  SuperPeople SuperPerson
 on SuperPerson.ID = Person.ID ) Person ) Person
 where Person.FAMILY_ID = 1
result =
 (Family)#0
  id = 1
  name = "pezel"
  people = (mx.collections::ArrayCollection)#1
   filterFunction = (null)
   length = 1
   list = (mx.collections::ArrayList)#2
    length = 1
    source = (Array)#3
     [0] (Person)#4
      familyId = 1
      id = 1
      name = "arnaud"
    uid = "A126F4E4-D083-68E2-0F34-723C76CA1A9C"
  sort = (null)
  source = (Array)#3

Ici Person est une sous class de SuperPerson. Le gros avantage comparé à un framework du type ActiveRecord c’est qu’il est possible de récupérer un objet et tous ses fils en une requête (et ceci récursivement). Dans le cas de listes cela peut s’avérer très pratique. De plus un support du batch fetching (récupération par groupe) est prévu dans la prochaine mise à jour.
Les save obéissent au même mécanisme, des cascade sont spécifiées par défaut mais peuvent être désactivées.

La dernière requête n’est pas très propre mais elle permet de supporter l’héritage à n-niveaux.

Tout ça devrait être disponible très prochainement sur google code. Stay tuned !

FileReference.browse et Flash player 10

Peut être avez vous eu la désagréable surprise de recevoir des mails de clients pas contents car leur site plante dès qu’ils veulent envoyer un document. Or, vous n’avez rien touché au site entre temps, donc vous commencez à farfouiller dans le code, jusqu’à ne voir qu’une seule explication : c’est le flash player 10.

Et bien oui, Adobe a certainement renforcé la sécurité au niveau du browse pour rendre impossible l’appel de la fonction FileReference.browse() lors d’un appel traditionnel. C’est à dire que si vous appelez la fonction sur le click, ou tout autre intéraction de l’utilisateur (souris ou clavier), cela fonctionnera sans soucis. Par contre, si vous le faite depuis une fonction traditionnelle (par exemple après avoir enregistré votre objet), et bien cela vous enverra le joli message suivant :

Main Thread (Suspended: Error: Error #2176: Certaines actions, par exemple celles qui ouvrent une fenêtre contextuelle, ne peuvent être invoquées que par une interaction de l'utilisateur, telle qu'un clic de souris ou un appui sur une touche.)
flash.net::FileReference/browse [no source]
flexBugs/onCreationComplete
flexBugs/___flexBugs_Application1_creationComplete
flash.events::EventDispatcher/dispatchEventFunction [no source]
flash.events::EventDispatcher/dispatchEvent [no source]
mx.core::UIComponent/dispatchEvent
mx.core::UIComponent/set initialized
mx.managers::LayoutManager/doPhasedInstantiation

Nous n’avons pas encore trouvé de solution permettant de contourner le problème (si vous en avez une, n’hésitez pas à la poster dans les commentaires), mais cela va vous obliger à changer votre code, et ouvrir directement le browse sur une interaction utilisateur.

Zend amf et mixed array

Pour ceux qui ont l’habitude d’utiliser AMFPHP Zend_amf, bien que très proche, pourrait être un peu troublant sur un point : les mixed array. Avec AMFPHP les objets de types mixed array sont sérialisés en tant qu’objet générique en flex (Object). Avec Zend_amf ce n’est plus le cas. Les objets de type array sont sérialisés sans transtypage et donc arrivent à flex en tant que tableau. Le problème c’est que ce type n’est pas très commode à utiliser en actionscript. Par exemple il est impossible d’utiliser le résultat brut dans un dataprovider et traverser la structure impose quelques lignes de code. Après avoir contacté Wade Arnold il semblerait que ce soit un comportement normal et qu’un cast soit possible avant l’envoi pour recevoir un objet de type Object. Voir son blog pour plus d’infos, il vient de poster un billet à ce sujet.