<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>La Fabrick &#187; Flex</title>
	<atom:link href="http://www.lafabrick.com/blog/tag/flex/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lafabrick.com/blog</link>
	<description>Laboratoire d&#039;interfaces riches (Flex, Flash, Air ...)</description>
	<lastBuildDate>Mon, 28 Nov 2011 22:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>MdaME, ma résolution 2011 de génération de code AS3</title>
		<link>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/</link>
		<comments>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 21:50:00 +0000</pubDate>
		<dc:creator>La Fabrick</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[generateur de code]]></category>
		<category><![CDATA[InMarket]]></category>
		<category><![CDATA[MDA]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2349</guid>
		<description><![CDATA[Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça. Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD. Ce petit outil nous a été utile pour pas mal de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png"><img class="size-full wp-image-2372 alignnone" title="MdaMe" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png" alt="" width="499" height="64" /></a></p>
<p>Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça.<br />
Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD.</p>
<p>Ce petit outil nous a été utile pour pas mal de projets développés pour nos premiers clients, alors pourquoi ne pas vous en faire profiter ? Peut-être deviendrez-vous aussi MdaME-addict ?</p>
<p>Retrouvez toutes les infos sur <a href="http://mdame.lafabrick.com">http://mdame.lafabrick.com</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/12/21/23-api-de-dessin-en-as3/" rel="bookmark" title="21 décembre 2006">API de dessin en AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/03/15/39-cre-ton-navigateur-perso-avec-5-lignes-de-code/" rel="bookmark" title="15 mars 2007">Crée ton navigateur perso avec 5 lignes de code !</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/27/309-flex-builder-3-et-le-php/" rel="bookmark" title="27 février 2008">Flex Builder 3 et le PHP ( PDT ) : installation</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/10/323-tuto-vido-skiner-un-composant-flex-3-avec-fireworks-cs3/" rel="bookmark" title="10 mai 2008">Skiner un composant Flex 3 avec Fireworks CS3 [Tutoriel Vidéo]</a></li>
</ul>
<p><!-- Similar Posts took 12.021 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</title>
		<link>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/</link>
		<comments>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 17:35:00 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2272</guid>
		<description><![CDATA[Pour ceux qui utilisent l&#8217;API de logging de Flex, au sein d&#8217;une application AIR ont certainement remarque qu&#8217;il manquait cruellement une Target &#171;&#160;fichier&#160;&#187; pour tracer dans un fichier texte (même si le résultat de la fonction trace se retrouve enfoui quelque part dans les tréfonds du répertoire de données du Flash Player). Pour ceux qui [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://help.adobe.com/en_US/flex/using/images/lg_logger_target_dist_popup.png" alt="Flex Logging API" width="506" height="60" /></p>
<p>Pour ceux qui utilisent l&#8217;<a href="http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f0f.html">API de logging de Flex</a>, au sein d&#8217;une application AIR ont certainement remarque qu&#8217;il manquait cruellement une Target &laquo;&nbsp;fichier&nbsp;&raquo; pour tracer dans un fichier texte (même si le résultat de la fonction <strong>trace</strong> se retrouve enfoui quelque part dans les tréfonds du répertoire de données du Flash Player).</p>
<p>Pour ceux qui se sont posés cette question, vous êtes sans doute tombés (Ô joie) sur la <a href="http://github.com/mikechambers/as3corelib/blob/master/src/com/adobe/air/logging/FileTarget.as">FileTarget</a> de notre ami <a href="http://twitter.com/#!/mesh">Mike Chambers</a> dans l&#8217;AS3 core lib.</p>
<p>Pour ceux qui se sont demandé s&#8217;il y avait un équivalent du <strong>RollingFileAppender</strong> de <strong>log4j</strong> en Flex (j&#8217;espère qu&#8217;il en reste, sinon restez, c&#8217;est bien quand même !), eh bien vous êtes certainement tombés sur l&#8217;ensemble vide.</p>
<p>N&#8217;y tenant plus, j&#8217;ai craqué sur une extension de la FileTarget pour créer le RollingFileTarget. Vous en voulez ?<br />
<span id="more-2272"></span></p>
<h2>Un rapide point sur l&#8217;API de logging</h2>
<p>Et pourquoi pas un bon vieux <code><strong>trace("qui tâche")</strong></code> ?<br />
Simplement parce que <strong><code>trace()</code></strong> trace tout, tout le temps, sans indication complémentaire sur le moment, ou la criticité de l&#8217;événement tracé. En clair, c&#8217;est très pratique pour en phase de test simple, lab ou autre, mais devient très vite inapproprié dès qu&#8217;on entre dans un développement structuré.</p>
<h2>Comment faire de jolies traces bien propres <span style="font-size: 8pt;">Aïe</span></h2>
<p>C&#8217;est très simple (cf. doc Flex) :</p>
<h3>La target</h3>
<pre class="brush: js">
/* Create a target. */
var logTarget:TraceTarget = new TraceTarget();

/* Log only messages for the classes in the mx.rpc.* and
mx.messaging packages. */
logTarget.filters=[&quot;mx.rpc.*&quot;,&quot;mx.messaging.*&quot;];

/* Log all log levels. */
logTarget.level = LogEventLevel.ALL;

/* Add date, time, category, and log level to the output. */
logTarget.includeDate = true;
logTarget.includeTime = true;
logTarget.includeCategory = true;
logTarget.includeLevel = true;

/* Begin logging. */
Log.addTarget(logTarget);
</pre>
<p>Vous noterez l&#8217;usage de la <strong>TraceTarget</strong> qui va indiquer d&#8217;envoyer les traces vers la console et donc faire comme la fonction <strong>trace()</strong>.<br />
La target permet d&#8217;aller un peu plus loin en indiquant notamment :</p>
<ul>
<li>le niveau de log : toute trace d&#8217;une criticité inférieure au niveau défini sera donc ignorée</li>
<li>des filtres sur les catégories de log : ces filtres vont permettre de n&#8217;envoyer sur la cible que les traces correspondantes</li>
</ul>
<h3>Le logger</h3>
<p>Nous avons donc une cible, maintenant il faut tracer ! Pour cela, il suffit de créer un logger :</p>
<pre class="brush: js">
private static var _logger:ILogger = Log.getLogger(&quot;com.lafabrick.classes.UneClasse&quot;);
</pre>
<p>Il est en général recommandé de créer un logger par classe de façon statique pour limiter le nombre d&#8217;instances en mémoire.<br />
Vous pouvez noter l&#8217;utilisation de la notation sous forme de packages permettant de faire le lien avec les filtres définis au niveau d&#8217;une target.<br />
Pour utiliser le <code>_logger</code>, vous pouvez appeler les méthodes suivantes :</p>
<pre class="brush: js">
_logger.debug(&quot;Trace niveau debug&quot;);
_logger.info(&quot;Trace niveau info&quot;);
_logger.warn(&quot;Trace niveau warning&quot;);
_logger.error(&quot;Trace niveau error&quot;);
_logger.fatal(&quot;Trace niveau fatal&quot;);
</pre>
<p>Les appels provoqueront l&#8217;ajout de votre trace à tout target définie correspondant au paramétrage de votre logger (catégorie et niveau).</p>
<h2>Faire sa target personnalisée</h2>
<p>Il ne reste plus qu&#8217;à écrire une target personnalisée qui va écrire dans un fichier au lieu d&#8217;écrire dans la console.</p>
<p>Vous pouvez pour cela étendre la classe <strong>AbstractTarget</strong> ou <strong>LineFormattedTarget </strong>(cette dernière prendra en charge la mise en forme du message pour vous, donc bien pratique).</p>
<p>C&#8217;est ce qu&#8217;a fait Mike avec sa <strong>FileTarget</strong> que je vous laisserai consulter sur <a href="http://github.com">Github</a>.</p>
<h2>La RollingFileTarget</h2>
<p>C&#8217;est sur ce modèle que j&#8217;ai développé la <strong>RollingFileTarget</strong> dont l&#8217;objectif est de pratiquer une rotation sur un fichier de log selon deux critères :</p>
<ol>
<li><strong>La date</strong><br />
Objectif : un fichier de log par jour, par mois ou par an</li>
<li><strong>Le poids</strong><br />
Objectif : la taille d&#8217;un fichier de log ne doit pas excéder N octets</li>
</ol>
<p><strong>Utilisation</strong></p>
<p>Il s&#8217;agit d&#8217;une target classique, utilisable comme la <strong>TraceTarget</strong> :</p>
<pre class="brush: js">
var fileTarget:RollingFileTarget = new RollingFileTarget(new File(&quot;app-storage:/logs/monappli.log&quot;));
fileTarget.filters = [&quot;*&quot;];
fileTarget.includeDate = true;
fileTarget.level = LogEventLevel.ERROR;
fileTarget.includeTime = true;
fileTarget.includeCategory = true;
fileTarget.includeLevel = true;
fileTarget.rollingInterval = RollingFileTarget.DAY_INTERVAL; // Un fichier de log par jour
fileTarget.maxLogFileWeight = 0; // Pas de limite de taille de fichier
fileTarget.maxLogBackups = 7; // Une semaine de roulement sur les fichiers de log
Log.addTarget(fileTarget);
</pre>
<p>A noter les trois propriétés suivantes :</p>
<ul>
<li><strong>rollingInterval</strong> : le mode de roulement par date. Vous avez le choix entre <strong>RollingFileTarget</strong>.<strong>DAY_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>MONTH_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>YEAR_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>NO_INTERVAL</strong><br />
Je ne traduis pas, j&#8217;imagine que vous comprenez <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>maxLogFileWeight</strong> : la taille maximale d&#8217;un fichier de log, en octets.<br />
Pour limiter la taille d&#8217;un fichier de log à 5Mo par exemple, vous pouvez indiquer maxLogFileWeight = 5000000. Une valeur à zéro désactive la rotation selon la taille du fichier.</li>
<li><strong>maxLogBackups </strong>: le nombre maximum de backups à conserver.<br />
Le principe réside en la conservation d&#8217;un nombre suffisant de logs pour retrouver les éléments importants ayant pu se passer. En général, une semaine de log suffit pour retrouver ses petits pour une application utilisée raisonnablement.</li>
</ul>
<div>Cette target a pour particularité de renommer le fichier de log courant selon le motif suivant :</div>
<div>
<ol>
<li><strong><span style="color: #008000;">AAAA-MM-JJ</span></strong><strong>-nom.log</strong> pour une rotation par date (<strong>année</strong> sur 4 chiffres, <strong>mois </strong>sur deux chiffres, <strong>jour </strong>sur deux chiffres)</li>
<li><strong>nom.log.</strong><strong><span style="color: #008000;">X</span></strong> pour une rotation par taille (X s&#8217;incrémentant de 1 à chaque rotation)</li>
</ol>
</div>
<p>A savoir que ce motif est utilisé par la target pour détecter les backups existants dans le répertoire de stockage de votre fichier de log principal et gérer ainsi proprement les backups entre deux lancements de l&#8217;application (oui, c&#8217;est rare de laisser tourner son appli pendant 2 semaines sans l&#8217;arrêter&#8230;)</p>
<p>Je n&#8217;ai donc pas préféré laisser le choix sur le motif de renommage pour éviter les problématiques pouvant évidemment en découler. En même temps, on a affaire à des fichiers de logs&#8230;</p>
<p><strong>Note importante :</strong> ces deux politiques sont combinables mais il est plus que conseillé de choisir entre un roulement sur le poids OU un roulement selon la date pour conserver des backup dans un ordre cohérent. En effet, si vous choisissez de combiner la rotation sur la taille ET sur le poids, vous aurez <em>maxLogBackups </em>fichiers de log suivant le motif <strong>AAAA-MM-JJ-nom.log</strong> et <em>maxLogBackups </em>fichiers de log suivant le motif <strong>nom.log.X</strong>.</p>
<p>J&#8217;envisage à terme que lors d&#8217;une rotation par date, l&nbsp;&raquo;ensemble des fichiers de backup par taille existants soient préfixés de la date du jour pour grouper correctement l&#8217;ensemble.</p>
<h3>Téléchargement</h3>
<p>Vous pouvez gracieusement télécharger, utiliser, modifier cette classe comme bon vous semble, La Fabrick déclinant toute responsabilité sur un quelconque dommage, problème ou perte d&#8217;information liée à son utilisation, de manière directe ou indirecte. Veillez également à respecter le copyright indiqué en entête du fichier, merci !</p>
<p><a href="http://github.com/hlabas/as3corelib/blob/master/src/com/adobe/air/logging/RollingFileTarget.as"><img class="aligncenter size-full wp-image-2281" title="Download" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/10/deb.png" alt="Télécharger" width="128" height="128" /></a></p>
<p>A noter bien entendu que cette classe utilise l&#8217;API d&#8217;accès au système de fichiers de AIR et ne peut donc être utilisée qu&#8217;au sein d&#8217;application compilées avec ce runtime.</p>
<p>Bons logs&#8230;Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/19/1609-flashplayer-101-et-multi-toucher-caresse-moi-le-flex/" rel="bookmark" title="19 février 2010">Caresse-toi le flex : FlashPlayer 10.1 et Multi-toucher</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
</ul>
<p><!-- Similar Posts took 13.466 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AIR 2 : appeler un JAR exécutable via un NativeProcess</title>
		<link>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/</link>
		<comments>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 00:21:08 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[JAR]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[NativeProcess]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2167</guid>
		<description><![CDATA[Vous avez certainement pu remarquer l&#8217;apparition attendue de la fonctionnalité d&#8217;exécution de code natif parmi les nouveautés de AIR 2.0. Les NativeProcess permettent d&#8217;étendre significativement les possibilités offertes par une application AIR. Mais, l&#8217;un des gros atouts d&#8217;Adobe AIR résidant dans sa nature multi-plateforme, il serait dommage de restreindre l&#8217;installation de votre application à un [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez certainement pu remarquer l&#8217;apparition attendue de la fonctionnalité d&#8217;exécution de code natif parmi les nouveautés de AIR 2.0. Les NativeProcess permettent d&#8217;étendre significativement les possibilités offertes par une application AIR.<br />
Mais, l&#8217;un des gros atouts d&#8217;Adobe AIR résidant dans sa nature multi-plateforme, il serait dommage de restreindre l&#8217;installation de votre application à un seul système d&#8217;exploitation&#8230; ça tombe bien, Java aussi est multi-plateforme (c&#8217;est bien l&#8217;open source) : OK du coup comment j&#8217;appelle du Java depuis mon AIR ?<br />
Explications&#8230;<br />
<span id="more-2167"></span></p>
<h2>Fonctionnement et limites d&#8217;un NativeProcess</h2>
<h3>Packaging de l&#8217;application</h3>
<p>Pour diverses raisons de sécurité, une application AIR utilisant un NativeProcess doit être packagée dans le format de la plateforme cible (exe pour Windows, dmg pour Mac, rpm / deb / &#8230; pour Linux). Fini donc dans ce cas le pratique fichier .air qui marche partout !<br />
Vous devez également indiquer dans le descripteur de l&#8217;application qu&#8217;il s&#8217;agit d&#8217;une application au profil &laquo;&nbsp;extendedDesktop&nbsp;&raquo; lui conférant donc les capacités d&#8217;exécuter un NativeProcess.<br />
Vous devez ouvrir le fichier <strong>monAppli-app.xml</strong> et modifier la balise <code>&lt;supportedProfiles&gt;</code></p>
<pre class="brush: xml">
&lt;supportedProfiles&gt;extendedDesktop&lt;/supportedProfiles&gt;
</pre>
<p>A partir de là, si vous tentez d&#8217;exporter un fichier .air, vous aurez un joli message d&#8217;erreur vous invitant à changer de profil.</p>
<h3>Considérations de sécurité</h3>
<p>Si AIR sans native process dispose de limitations de sécurité, dès lors que vous utilisez un native process, vous ouvrez la porte&#8230; Il est donc bon d&#8217;anticiper et de faire un maximum de vérifications sur vos appels pour éviter un remplacement d&#8217;un exécutable par un autre, moins sympathique, par exemple&#8230;</p>
<h2>Prêt ? On code</h2>
<h3>Paramétrage</h3>
<p>Un native process a besoin d&#8217;un contexte d&#8217;exécution. Ce contexte est défini à l&#8217;aide de l&#8217;objet <code>NativeProcessStartupInfo</code> décrivant notamment les éléments suivants :</p>
<ul>
<li><strong>workingDirectory</strong> : le répertoire d&#8217;exécution</li>
<li><strong>executableFile</strong> : l&#8217;exécutable à lancer</li>
<li><strong>arguments</strong> : la liste des arguments à passer à l&#8217;exécutable (<code>Vector.&lt;String&gt;</code> sous Flash Player 10, ou un bête <code>Array</code> sinon)</li>
</ul>
<p>Vous pourrez alors instancier un objet NativeProcess et lui passer cet objet de paramétrage avant de le lancer.</p>
<h3>Lancement &amp; suivi de l&#8217;exécution</h3>
<p>Le lancement d&#8217;un NativeProcess est asynchrone. Il propose donc un certain nombre d&#8217;événements vous permettant de suivre son exécution une fois lancé, notamment :</p>
<ul>
<li><strong>ProgressEvent.STANDARD_OUTPUT_DATA</strong> : écriture sur la sortie standard</li>
<li><strong>ProgressEvent.STANDARD_ERROR_DATA</strong> : écriture sur la sortie d&#8217;erreur</li>
<li><strong>IOErrorEvent.STANDARD_OUTPUT_IO_ERROR</strong> : déclenché lorsqu&#8217;une erreur apparaît en tentant de lire la sortie standard</li>
<li><strong>IOErrorEvent.STANDARD_ERROR_IO_ERROR</strong> : déclenché lorsqu&#8217;une erreur apparaît en tentant de lire la sortie d&#8217;erreur</li>
<li><strong>NativeProcessExitEvent.EXIT</strong> : déclenché lors que l&#8217;exécution du process est terminée</li>
</ul>
<h3>Lecture de l&#8217;entrée / sortie standard</h3>
<p>Bien que tout à fait possible, la lecture de la sortie standard ou d&#8217;erreur via le listener <code>ProgressEvent.STANDARD_OUTPUT_DATA</code> ou <code>ProgressEvent.STANDARD_ERROR_DATA</code> n&#8217;est pas fiable à 100% concernant le contenu retourné : la sortie étant &laquo;&nbsp;bufferisée&nbsp;&raquo;, vous n&#8217;aurez donc pas systématiquement le même résultat selon la machine exécutant le programme, à chaque appel de votre listener&#8230; N&#8217;utilisez donc la lecture de sortie standard que pour afficher ce qui se passe, ou à la limite récupérer la totalité du contenu écrit une fois le process terminé&#8230;</p>
<h2>Appeler un JAR</h2>
<h3>Rappels</h3>
<p>Pour appeler un JAR en Java, il doit être exécutable (bah oui&#8230;), et appelé en ligne de commande de la manière suivante :<br />
<code><br />
java -jar monJar.jar [-cp jars du classpath]<br />
</code><br />
Nous sommes dans une appli AIR, donc évitons de surcharger la commande à appeler avec un classpath, aussi je vous suggère d&#8217;utiliser les fonctionnalités d&#8217;export complets d&#8217;un JAR (si les licences associées vous l&#8217;autorisent) intégrant au final l&#8217;ensemble des sources dans un groooos JAR contenant tout ce qu&#8217;il lui faut pour fonctionner.<br />
<strong>Notes :</strong></p>
<ul>
<li>Les utilisateurs de Maven peuvent utiliser <a title="Plugin maven assembly et configuration associée" href="http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven">le plugin qui va bien pour ça</a>.</li>
<li>L&#8217;export eclipse, c&#8217;est pas mal non plus, il suffit de cocher la &laquo;&nbsp;case qui va bien&nbsp;&raquo; au moment d&#8217;exporter</li>
</ul>
<h3>Depuis un NativeProcess</h3>
<p>On voit mieux ce qui se dessine:</p>
<ol>
<li>Définir l&#8217;exécutable java dans vos &laquo;&nbsp;startup infos&nbsp;&raquo;</li>
<li>Définir les arguments
<ul>
<li>-jar</li>
<li>/chemin/vers/monJar.jar</li>
</ul>
</li>
<li>Ajouter les listeners permettant de savoir lorsque l&#8217;exécution est terminée</li>
<li>Lancer le native process</li>
</ol>
<h3>Restons multi plateforme</h3>
<p>Java est multi plateforme, oui, mais l&#8217;exécutable dépend de la plateforme, aussi il vous faudra récupérer le chemin vers votre JAVA_HOME (contenant le répertoire bin avec l&#8217;exécutable Java).<br />
Vous avez donc deux solutions maintenant:</p>
<ol>
<li><strong>La plus simple</strong> (pour le développeur) : demander à votre gentil utilisateur où est son JAVA_HOME. Ça peut le faire si c&#8217;est un geek velu qui a compris qu&#8217;on ne parlait pas de venir danser chez lui (aïe, elle est rude celle-ci)</li>
<li><strong>La plus compliquée</strong> (mais pratique pour l&#8217;utilisateur) : utiliser un autre exécutable (voire NativeProcess) qui remonte cette information ou permette de pointer directement sur l&#8217;exécutable en question</li>
</ol>
<p>La seconde solution bien que séduisante est un peu plus longue à implémenter.<br />
Pour les développeurs sous Windows, j&#8217;ai noté l&#8217;utilisation par <a href="www.webkitchen.be">Serge Jespers</a> d&#8217;un petit (mais pratique) exécutable &laquo;&nbsp;jexe.exe&nbsp;&raquo; lançant le java.exe présent dans le %JAVA_HOME%\bin de la machine. L&#8217;utiliser vous évitera la première solution, sans vous lancer dans un développement spécifiquement dédié à cela (merci Serge). En revanche, si votre application est diffusée à un public d&#8217;utilisateurs non avertis, ils sont tout à fait susceptibles de ne pas avoir de variable JAVA_HOME définie sur leur machine : pensez donc à déterminer précisément votre cible avant de choisir une solution.</p>
<p>J&#8217;ai également noté en relisant un extrait de la licence du JRE que la redistribution est autorisée sous certaines conditions. Si vous les remplissez, vous pourriez carrément embarquer le runtime java dans votre application AIR, au risque de la faire gonfler en taille&#8230;</p>
<h2>Un exemple ! Un exemple !</h2>
<p>Voici un petit exemple de code permettant de lancer un JAR exécutable depuis une application AIR :</p>
<pre class="brush: java">
package com.lafabrick.nativeprocess
{
import flash.desktop.NativeProcess;
import flash.desktop.NativeProcessStartupInfo;
import flash.events.EventDispatcher;
import flash.events.NativeProcessExitEvent;
import flash.events.ProgressEvent;
import flash.filesystem.File;
import flash.system.Capabilities;

public class JarExec
{
protected var _process:NativeProcess;

public function JarExec()
{
}

public function getDefaultJavaExecutable():File
{
if (Capabilities.os.toLowerCase().indexOf(&quot;win&quot;) &gt; -1)
{
return File.applicationDirectory.resolvePath(&quot;native/jexe.exe&quot;);
}
if (Capabilities.os.toLowerCase().indexOf(&quot;mac&quot;) &gt; -1)
{
// TODO: Changer avec un paramètre de configuration
return new File(&quot;/System/Library/Frameworks/JavaVM.framework/Commands/java&quot;);
}
throw new Error(&quot;Système non pris en charge&quot;);
return null;
}

public function testJava(executablePath:String = null):void
{
// Tester le lancement de l&#039;exécutable &#039;java&#039;
try
{
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
nativeProcessStartupInfo.workingDirectory = File.applicationDirectory;
nativeProcessStartupInfo.executable = (executablePath == null ? getDefaultJavaExecutable() : new File(executablePath));

var args:Vector.&lt;String&gt; = new Vector.&lt;String&gt;();
args.push(&quot;-version&quot;);
nativeProcessStartupInfo.arguments = args;

_process = new NativeProcess();
_process.addEventListener(NativeProcessExitEvent.EXIT, onJavaTestExit);
_process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onStandardOut);
_process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorOut);
_process.start(nativeProcessStartupInfo);

trace(&quot;-- Début d&#039;exécution&quot;);
}
catch (e:Error)
{
trace(&quot;Impossible de lancer le process\n&quot; + e.message + &quot;\n&quot; + e.getStackTrace());
}
}
protected function onStandardOut(e:ProgressEvent):void
{
trace(&quot;STDOUT: &quot; + _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable));
}
protected function onErrorOut(e:ProgressEvent):void
{
trace(&quot;STDERR: &quot; + _process.standardError.readUTFBytes(_process.standardError.bytesAvailable));
}
protected function onJavaTestExit(e:NativeProcessExitEvent):void
{
trace(&quot;-- Fin d&#039;exécution&quot;);
}
}
}
</pre>
<p>Cet extrait donne un aperçu, mais vous pouvez vous lancer (soyons fous) à installer le package suivant :</p>
<table style="text-align: center;">
<tbody>
<tr>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.dmg"><img title="Mac" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/mac.gif" alt="" width="50" height="50" /><br />
Pour Mac</a></td>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.exe"><img title="Windows" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/windows.jpeg" alt="" width="50" height="50" /><br />
Pour Windows</a></td>
</tr>
</tbody>
</table>
<p>Pensez au clic droit &gt; View Source&#8230;</p>
<h2>Packager l&#8217;application</h2>
<p>Comme je le disais au début de ce post, il est nécessaire de packager votre application dans le format natif du système d&#8217;exploitation visé. Vous avez deux solutions pour cela :</p>
<ol>
<li>Passer par la dernière version de Flash Builder 4 qui propose cette fonctionnalité</li>
<li>Utiliser l&#8217;application <a href="http://www.webkitchen.be/package-assistant-pro/">PackageAssistantPro</a> proposée par <a href="http://www.webkitchen.be">Serge Jespers</a> (re merci Serge)</li>
</ol>
<p>Il s&#8217;agit d&#8217;une application AIR utilisant des NativeProcess (et packagée en ligne de commande vu que l&#8217;application n&#8217;existait pas avant&#8230; Remarquez, la version 2 et plus ont probablement été packagées avec la version 1&#8230; Mais je m&#8217;égare)</p>
<h2>Quelques liens</h2>
<ul>
<li>Un petit exemple d&#8217;application utilisant un NativeProcess : <a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/">ZXPackager</a></li>
<li><a lang="en_US" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/desktop/NativeProcess.html">ASDoc de la classe NativeProcess [EN]</a></li>
<li><a lang="en_US" href="http://www.adobe.com/devnet/air/flex/quickstart/interacting_with_native_process.html">Un bon article pour démarrer [EN]</a></li>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/" rel="bookmark" title="6 avril 2010">Arduino #2 : Flash, socket et Processing</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/" rel="bookmark" title="21 octobre 2010">RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</a></li>
</ul>
<p><!-- Similar Posts took 18.623 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</title>
		<link>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 21:10:53 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Applications]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Lafabrick]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[zxp]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2092</guid>
		<description><![CDATA[Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique Applications au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &#171;&#160;aide au développeur&#160;&#187;. ZXPackager est la première d&#8217;entre elles. Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite. Les extensions ZXP Depuis la CS5, Adobe [...]]]></description>
			<content:encoded><![CDATA[<table width="100%">
<tbody>
<tr>
<td width="125px"><img class="aligncenter size-full wp-image-2099" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/logo128.png" alt="" width="128" height="128" /></td>
<td width="100%">Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique <a href="http://www.lafabrick.com/blog/applications/">Applications</a> au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &laquo;&nbsp;aide au développeur&nbsp;&raquo;. ZXPackager est la première d&#8217;entre elles.</p>
<p>Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite.</td>
</tr>
</tbody>
</table>
<p><span id="more-2092"></span></p>
<h2>Les extensions ZXP</h2>
<p>Depuis la CS5, Adobe propose un nouveau SDK de développement et un format d&#8217;extension commun a toute la suite logicielle.<br />
Ce SDK, <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">disponible ici</a>, vous permet de développer vos propres panneaux et autres menus CS5. Le premier format de sortie est le MXP, toujours disponible, vous permettant d&#8217;exporter votre extension pour un logiciel cible.<br />
Maintenant, avec la CS5, vous disposez d&#8217;un format commun, le ZXP, qui rend compatible votre extension avec toutes la suites CS.</p>
<p>Un fichier ZXP est défini par un manifeste xml, définissant le fonctionnement de l&#8217;extension (type, portée logiciel, &#8230;), et contient le (les) SWF de l&#8217;extension (une extension est en fait une pseudo application AIR, basée sur le SDK CS). Un fichier ZXP est signé numériquement. Vous devez donc avoir un certificat (PKCS12, PKCS11, JKS). Vous pouvez bien entendu utiliser votre certificat auto-signé préalablement créé avec Flash/Flex Buider.</p>
<p>Pour plus d&#8217;informations :</p>
<ul>
<li><a href="http://www.adobe.com/devnet/creativesuite/sdk/index.html">Creative Suite SDK</a></li>
<li><a href="http://blogs.adobe.com/cssdk/">le blog CSSDK</a></li>
</ul>
<p>Un fichier ZXP doit (habituellement) être compilé en utilisant le packager Java <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">UCF</a>. Et c&#8217;est là l&#8217;idée de cette petite application : ne pas avoir a redéfinir vos certificats et autres options pour chaque package, et vous proposer une interface plus &laquo;&nbsp;user friendly&nbsp;&raquo; que le terminal.</p>
<h2>Fonctionnement</h2>
<h3>Démarrage, et préférences</h3>
<p>Au premier démarrage, l&#8217;application doit obtenir vos préférences de base.</p>
<p><img class="aligncenter size-full wp-image-2100" title="Preferences" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/Preferences.png" alt="Preferences" width="500" height="450" /></p>
<ul>
<li>
<h4>Java Home</h4>
<p>Vous devez indiquer le chemin vers votre JDK/JRE java, si celui-ci ne correspond pas à celui par défaut (l&#8217;application intègre le packager jar UCF, et elle doit connaître le répertoire racine de Java pour pouvoir le lancer). Les chemins racines par défaut sont:</p>
<ul>
<li>Pour Windows : <strong>&#8216;C:\Program Files\Java\jdk1.6.0&#8242;</strong></li>
<li>Pour Mac : <strong>&#8216;/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0&#8242;</strong></li>
</ul>
</li>
<li>
<h4>Certificat</h4>
<p>Vous devez préciser l&#8217;emplacement de votre certificat (généralement un fichier de type .p12 ou .p11), ainsi que votre mot de passe. Ces informations sont nécessaires pour la signature de l&#8217;extension.</p>
<ul>
<li>
<h4>Fichier cible</h4>
<p>Vous devez indiquer le fichier de destination. L&#8217;extension .zxp est ajoutée automatiquement.</li>
<li>
<h4>Source de l&#8217;extension</h4>
</li>
<p>Les sources de l&#8217;extension, comme défini dans la nomenclature du SDK CS, doivent correspondre à ce schéma:</p>
<p><img class="aligncenter size-full wp-image-2096" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/binPackageOverview.png" alt="" width="537" height="80" /><br />
Ce répertoire est construit préalablement par la tâche ant de compilation, dans votre projet (cf. en fin d&#8217;article, le téléchargement du projet test d&#8217;extension)<br />
Vous devez pointer sur le répertoire &laquo;&nbsp;bin&nbsp;&raquo;.</ul>
<ul>
<li>Démarrer un nouveau package;</li>
<li>Ouvrir et installer l&#8217;extension via Extension Manager (vous devez bien entendu avoir préalablement installé Extension Manager CS5)</li>
</ul>
<ul>
<li><a href="http://lafabrick.com/applications/zxpackager/extensionTest.fxp">Projet fxp</a></li>
<li><a href="http://lafabrick.com/applications/zxpackager/bin.zip">Archive zip du bin de test</a></li>
</ul>
</li>
<h3>Définition de votre extension</h3>
<p>Un package ZXP a besoin de 2 informations : le nom et l&#8217;emplacement de votre extension cible, et l&#8217;endroit où se trouve le répertoire &laquo;&nbsp;bin&nbsp;&raquo; de votre extension.</p>
<p><img class="aligncenter size-full wp-image-2102" title="StartProject" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/StartProject.png" alt="start package" width="500" height="450" /></p>
<p>Une fois le packaging démarré, un message d&#8217;attente s&#8217;affiche.</p>
<p><img class="aligncenter size-full wp-image-2103" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/waiting-mini.png" alt="" width="467" height="48" /></p>
<h3>Finalisation</h3>
<p>Une fois le package créé, l&#8217;application vous propose de :</p>
<p><img class="aligncenter size-full wp-image-2097" title="completed" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/completed.png" alt="" width="500" height="450" /></p>
<h2>Téléchargements</h2>
<h3>ZXPackager</h3>
<table>
<tbody>
<tr>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-MAC.zip"><img class="aligncenter size-full wp-image-2137" title="macPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/macPackageExport.png" alt="" width="128" height="128" /></a></td>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-WIN.zip"><img class="aligncenter size-full wp-image-2137" title="winPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/winPackageExport.png" alt="" width="128" height="128" /></a></td>
</tr>
</tbody>
</table>
<h3>Extension de test</h3>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/09/04/206-flex-3-beta-rsolution-de-bug-comment-placer-fichier-d-application/" rel="bookmark" title="4 septembre 2007">[Flex 3 Beta] bug : Application File doesn&#8217;t exist</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/" rel="bookmark" title="21 octobre 2010">RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</a></li>
</ul>
<p><!-- Similar Posts took 13.270 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Flex 4 et les layouts &#8211; Faire une ViewStack &#171;&#160;pure&#160;&#187; Spark</title>
		<link>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 16:06:03 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1920</guid>
		<description><![CDATA[Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &#60;mx:&#62; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-medium wp-image-1930" title="layouts" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/layouts-300x155.png" alt="layouts" width="300" height="155" /><br />
Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &lt;mx:&gt; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture Spark propose quelque chose de top : les layouts. Et les layouts, c&#8217;est vaaaachement bien.</p>
<p>Explication&#8230;<br />
<span id="more-1920"></span></p>
<h2>Layouts</h2>
<p>Sans faire un article complet sur les layout (ce qui serait tout à fait possible et intéressant), on peut tout de même rappeler que le Flex 4 se distingue de Flex 3 via Spark par une volonté de mieux séparer le fond de la forme, il amène donc une notion de layout pour, comme son nom le suggère, organiser les composants d&#8217;un conteneur (par exemple un &lt;s:Group&gt;).<br />
Exit donc la <em>VBox</em> ou la <em>HBox</em> (même si le VGroup ou le HGroup permettent de faire une transition en douceur), et bienvenue au <strong>Group</strong> avec layout :</p>
<pre class="brush: xml">
&lt;mx:VBox&gt;
&lt;/mx:VBox&gt;
</pre>
<p>devient donc</p>
<pre class="brush: xml">
&lt;s:Group&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout /&gt;
&lt;/s:layout&gt;
&lt;/s:Group&gt;
</pre>
<p>Au premier abord on dit : c&#8217;est plus verbeux ! Oui mais&#8230; le layout a cette particularité, en tant que propriété du composant, d&#8217;être modifiable à la volée, contrairement à un composant imposant sa mise en forme. Concrètement, là où la <em>VBox</em> présentera toujours ses enfants verticalement (c&#8217;est son nom !), le <em>Group</em> pourra changer à volonté de layout, donc très facilement passer de <em>HorizontalLayout</em> à <em>VerticalLayout</em> par exemple&#8230; On comprend encore mieux l&#8217;intérêt quand on se met à écrire son propre layout pour faire des choses un peu plus poussées visuellement !</p>
<h2>Créer son layout</h2>
<p>Pour créer un layout, il faut étendre la classe LayoutBase et surcharger a minima la méthode updateDisplayList() et certainement la méthode measure(). Ces méthodes gardent le même rôle qu&#8217;en Flex 3, mais avec l&#8217;adaptation contextuelle au Layout :</p>
<ul>
<li>updateDisplayList : dispose les enfants du conteneur et définit leur taille</li>
<li>measure : donne la taille globale du conteneur</li>
</ul>
<p>Vous pouvez accéder à la propriété &laquo;&nbsp;target&nbsp;&raquo; du layout qui correspond au conteneur auquel est appliqué le layout et travailler sur les enfant via les méthodes getElementAt() ou getVirtualElementAt(). La seconde méthode sert dans le cas où le layout est dit &laquo;&nbsp;virtualisé&nbsp;&raquo;.</p>
<h3>Apparté : virtualisation de layout</h3>
<p>Flex 4 permet, pour des raison de performance, d&#8217;utiliser un layout en mode &laquo;&nbsp;virtualisé&nbsp;&raquo;, c&#8217;est-à-dire ne calculant la disposition des seuls enfants à afficher et non l&#8217;ensemble des enfants. Ce mode de fonctionnement s&#8217;applique particulièrement bien aux composants comprenant une liste de beaucoup d&#8217;enfants, mais ne calculant l&#8217;affichage d&#8217;une poignée à la fois, le reste attendant un scroll ou une action similaire pour être éventuellement affiché.</p>
<h2>Application : création d&#8217;un ViewStackLayout</h2>
<p>Avec les layouts en tête, il est inutile de demander pourquoi le composant ViewStack n&#8217;existe pas dans Spark : il devrait en pratique être un layout applicable à n&#8217;importe quel conteneur ! Même si le <a lang="en" href="http://opensource.adobe.com/wiki/display/flexsdk/Spark+Virtualization">très bon article sur la virtualisation</a> mentionne un prometteur je cite &laquo;&nbsp;(Planned) StackLayout&nbsp;&raquo;, rien ne nous empêche d&#8217;en faire un simple, adapté à l&#8217;architecture Spark, plutôt que d&#8217;attendre (oui on est impatients à la fabrick).</p>
<p>Voici un exemple simple :</p>
<pre class="brush: js">
	import mx.core.IVisualElement;
	import spark.layouts.supportClasses.LayoutBase;

	public class ViewStackLayout extends LayoutBase {
		public function ViewStackLayout() {
			super();
		}

		protected var _index:uint;

		public function get index():Number {
			return _index;
		}

		public function set index(value:Number):void {
			if (_index != value &amp;&amp; target != null &amp;&amp; value &gt;= 0 &amp;&amp; value &lt; target.numElements) {
				_index = value;
				target.invalidateSize();
				target.invalidateDisplayList();
			}
		}

		override public function updateDisplayList(width:Number, height:Number):void {
			var element:IVisualElement = useVirtualLayout ? target.getVirtualElementAt(index) : target.getElementAt(index);

			if (element) {
				element.setLayoutBoundsSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
				target.setActualSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
				target.setContentSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
			}
		}

		override public function measure():void {
			var count:int = target.numElements;

			for (var i:uint = 0; i &lt; count; i++) {
				var element:IVisualElement = useVirtualLayout ? target.getVirtualElementAt(i) : target.getElementAt(i);

				if (i == index) {
					element.visible = true;
					element.includeInLayout = true;
					target.measuredWidth = element.getPreferredBoundsWidth();
					target.measuredHeight = element.getPreferredBoundsHeight();
				} else {
					element.visible = false;
					element.includeInLayout = false;
				}
			}
		}
	}
</pre>
<p>Vous noterez ici l&#8217;usage du getVirtualElementAt, en prévision de la gestion de la virtualisation.<br />
Vous pouvez donc utiliser ce layout dans un DataGroup &laquo;&nbsp;piloté&nbsp;&raquo; par une tabbar par exemple comme ceci :</p>
<pre class="brush: xml">
&lt;s:TabBar id=&quot;tabEditors&quot; /&gt;
&lt;s:DataGroup id=&quot;editors&quot;&gt;
&lt;s:layout&gt;
&lt;mylayouts:ViewStackLayout index=&quot;{tabEditors.selectedIndex}&quot; /&gt;
&lt;/s:layout&gt;
&lt;!-- Enfants... --&gt;
&lt;/s:DataGroup&gt;
</pre>
<p>De cette façon, le jour où vous voudrez présenter ces éléments sous forme de CoverFlow, en mode TimeMachine&#8230; vous n&#8217;aurez pas à modifier le code de votre composant, mais uniquement votre skin.</p>
<p>Alors, on n&#8217;est pas mieux habillé en Spark ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/" rel="bookmark" title="13 janvier 2009">Reflex #1: une micro-architecture pour Flex&#8230; simple !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/03/05/1675-proches-de-lohio-les-etats-esthetes-de-flex4/" rel="bookmark" title="5 mars 2010">Proches de l&#8217;Ohio??? Les états esthètes de Flex4</a></li>
</ul>
<p><!-- Similar Posts took 15.570 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>UIGFX practice : a CircularSlider component</title>
		<link>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/</link>
		<comments>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/#comments</comments>
		<pubDate>Tue, 04 May 2010 21:18:39 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1962</guid>
		<description><![CDATA[If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components? As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive UIGFX library, including the [...]]]></description>
			<content:encoded><![CDATA[<p>If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components?<br />
As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive <a href="http://code.google.com/p/uigfx/">UIGFX library</a>, including the <a href="http://code.google.com/p/uigfx/source/browse/trunk/uigfx/src/com/lafabrick/uigfx/primitives/Pie.as">Pie primitive</a>.<br />
Let see how it works&#8230;<br />
<span id="more-1962"></span><br />
<H2>The component</H2></p>
<h3>PieButton</h3>
<p>I needed a button with 2 properties <code>startAngle</code> and <code>angle</code>, to be able to transmit these values to the skin: </p>
<pre class="brush: js">
package com.lafabrick.components
{
    import spark.components.Button;

    public class PieButton extends Button
    {
        public function PieButton()
        {
            super();
        }

        private var _angle : Number;
        private var _startAngle : Number;

        public function get angle():Number
        {
            return _angle;
        }
        [Bindable]public function set angle(value:Number):void
        {
            _angle = value;
            invalidateDisplayList();
        }

        public function get startAngle():Number
        {
            return _startAngle;
        }
        [Bindable]public function set startAngle(value:Number):void
        {
            _startAngle = value;
            invalidateDisplayList();
        }

    }
}
</pre>
<h3>CircularSlider</h3>
<p>This component could not extend directly SliderBase or TrackBase because the SkinPart thumb and track, as Button, are extending the TrackBase class.<br />
I thus used the Range class, inserted the Slider architecture, and added specific geometric codes.<br />
<a href="http://fabien.lafabrick.com/labs/components/circularslider/srcview/source/fxComponentKit/src/com/lafabrick/components/CircularSlider.as.html">Check the component&#8217;s source code</a></p>
<h2>Skin implementation</h2>
<p>The design of the Skin is similar to a skin Slider standard, except that it uses a PieButton instead of a Button: </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
        xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
        xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        xmlns:components=&quot;com.lafabrick.components.*&quot;
        &gt;
    &lt;!-- host component --&gt;
    &lt;fx:Metadata&gt;
        [HostComponent(&quot;com.lafabrick.components.CircularSlider&quot;)]
    &lt;/fx:Metadata&gt;

    &lt;!-- states --&gt;
    &lt;s:states&gt;
        &lt;s:State name=&quot;normal&quot; /&gt;
        &lt;s:State name=&quot;disabled&quot; /&gt;
        &lt;s:State name=&quot;inactive&quot; /&gt;
    &lt;/s:states&gt;

    &lt;!-- SkinParts
    name=track, type=com.lafabrick.uigfx.components.CircularButton
    name=thumb, type=com.lafabrick.uigfx.components.CircularButton
    --&gt;

    &lt;components:PieButton
        id=&quot;track&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        skinClass=&quot;skins.CircularTrackButtonSkin&quot;/&gt;

    &lt;components:PieButton
        id=&quot;thumb&quot;
        angle=&quot;20&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        skinClass=&quot;skins.CircularThumbButtonSkin&quot;/&gt;

&lt;/s:SparkSkin&gt;
</pre>
<p>Under &laquo;&nbsp;thumb&nbsp;&raquo; and &laquo;&nbsp;track&nbsp;&raquo; Skin, the angular values are a mapped with the PieButton HostComponent. StartAngle and angle properties of the Pie primitive are directly extended from the host component.<br />
Here follows a sample with Track Skin:</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
             xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot; 

             minWidth=&quot;21&quot; minHeight=&quot;21&quot;
             alpha.disabled=&quot;0.5&quot;
             xmlns:uigfx=&quot;http://uigfx.lafabrick.com&quot;
             xmlns:primitives=&quot;com.lafabrick.uigfx.primitives.*&quot;&gt;

    &lt;fx:Metadata&gt;
        [HostComponent(&quot;com.lafabrick.components.PieButton&quot;)]
    &lt;/fx:Metadata&gt;

    &lt;s:states&gt;
        &lt;s:State name=&quot;up&quot; /&gt;
        &lt;s:State name=&quot;over&quot; /&gt;
        &lt;s:State name=&quot;down&quot; /&gt;
        &lt;s:State name=&quot;disabled&quot; /&gt;
    &lt;/s:states&gt;

    &lt;primitives:Pie
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        gap=&quot;2&quot;
        innerOffset=&quot;-2&quot;
        offset=&quot;-2&quot;

        innerRadius=&quot;0.7&quot;
        angle=&quot;{hostComponent.angle}&quot;
        startAngle=&quot;{hostComponent.startAngle}&quot;
        &gt;

        &lt;primitives:fill&gt;
            &lt;s:RadialGradient&gt;
                &lt;s:GradientEntry color=&quot;#006699&quot; /&gt;
                &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
            &lt;/s:RadialGradient&gt;
        &lt;/primitives:fill&gt;

        &lt;primitives:filters&gt;
            &lt;s:GlowFilter inner=&quot;true&quot; color=&quot;#000000&quot;
                blurX=&quot;10&quot; blurY=&quot;10&quot; alpha=&quot;0.4&quot; /&gt;
        &lt;/primitives:filters&gt;

    &lt;/primitives:Pie&gt;

&lt;/s:SparkSkin&gt;
</pre>
<p><H2>Result</H2><br />
Let see:<br />
<object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" width="640" height="500"><param name="movie" value="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" /><param name="bgcolor" value="#ffffff" /><param name="allowScriptAccess" value="sameDomain" /><param name="allowFullScreen" value="true" /></object><br />
Nice huh?</p>
<p>You can check these for more info: <a href="http://fabien.lafabrick.com/labs/components/circularslider/">Link</a>, and <a href="http://fabien.lafabrick.com/labs/components/circularslider/srcview/index.html">source code</a>.</p>
<p>PS: Thanks to Hervé for review and corrections!Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/" rel="bookmark" title="23 juillet 2010">Primitive DashedLine : une petite ligne bien utile</a></li>
</ul>
<p><!-- Similar Posts took 13.587 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caresse-toi le flex : FlashPlayer 10.1 et Multi-toucher</title>
		<link>http://www.lafabrick.com/blog/2010/02/19/1609-flashplayer-101-et-multi-toucher-caresse-moi-le-flex/</link>
		<comments>http://www.lafabrick.com/blog/2010/02/19/1609-flashplayer-101-et-multi-toucher-caresse-moi-le-flex/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 16:11:39 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[FlashPlayer]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[multitouch]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1609</guid>
		<description><![CDATA[Vous le savez surement, la beta de Flash Player 10.1 nous permet maintenant à nous aussi, practiciens de la flash platform, d&#8217;entrer dans l&#8217;ère de l&#8217;expérience tactile. &#171;&#160;Pretty exciting&#160;&#187;! pourrait-on s&#8217;exclamer, mais puisque l&#8217;air du temps est plutôt à l&#8217;identitaire national, faisons un effort et parlons &#171;&#160;franc&#160;&#187; : le multi-toucher, çà envoie bien du cervelas [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/gesturenotifierbandeau.jpg" alt="gesturenotifierbandeau" title="gesturenotifierbandeau" width="520" height="130" class="alignnone size-medium wp-image-1612" /></p>
<p>Vous le savez surement, la beta de Flash Player 10.1  nous permet maintenant à nous aussi, practiciens de la flash platform, d&#8217;entrer dans l&#8217;ère de l&#8217;expérience tactile. &laquo;&nbsp;Pretty exciting&nbsp;&raquo;!  pourrait-on s&#8217;exclamer, mais puisque l&#8217;air du temps est plutôt à l&#8217;identitaire national, faisons un effort et parlons &laquo;&nbsp;franc&nbsp;&raquo; : le multi-toucher, çà envoie bien du cervelas en croûte !!!</p>
<p><span id="more-1609"></span></p>
<p>Bon alors par contre pour profiter dès aujourd&#8217;hui du jouet, il est nécessaire de valider une des conditions suivantes :<br />
- posséder un macbook (pro) récent sous snow leopard ( 10.6 ) (je sais pas trop si ca marche avec les magic mouse)<br />
- posséder un pc sous windows 7&#8230; avec écran multitouch<br />
- ou encore plus rare, faire partie des betatesteurs du prochain flash CS(x)&#8230; et d&#8217;une licence de dev iphone&#8230; et d&#8217;un iphone&#8230; ( d&#8217;ici quelques mois, les possesseurs de <a href="http://tv.adobe.com/watch/adobe-at-mobile-world-congress-2010/nvidia-runs-flash-player-101-and-adobe-air-on-tablet-devices/"> la plupart téléphones/tablettes tactiles</a> et du prochain flash CS(x) pourront eux aussi jouer ).</p>
<h2>Installation</h2>
<p>Si tu as passé la 1ère épreuve, il te reste l&#8217;épreuve pratique : <a href="http://labs.adobe.com/technologies/air2/">l&#8217;installation du SDK et du runtime AIR 2.0 ( beta1 ou beta2 )</a></p>
<p>Pour une installation &laquo;&nbsp;optimale&nbsp;&raquo; :<br />
- Flash Builder Beta2 : <a href="http://labs.adobe.com/technologies/flashbuilder4/">http://labs.adobe.com/technologies/flashbuilder4/</a><br />
- une version stable récente du SDK Flex : 4.0.0.13875 datée du 29.01.2010 <a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4">http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4</a> ( pas mal de choses ont évoluées depuis la version 4.0.0.10485 distribuées avec Flash Builder beta 2 )<br />
- placez le contenu du SDK téléchargé dans : Dossier Flash Builder Beta2/sdks/<br />
- Installez le runtime et téléchargez le SDK <a href="http://labs.adobe.com/technologies/air2/">AIR 2 beta 2</a> cf. <a href="http://labs.adobe.com/wiki/index.php/AIR_2:Release_Notes">guide d&#8217;installation du SDK</a><br />
- Dans les préférences de FlashBuilder/Eclipse : Flash Builder / installed Flex SDKs / , ajoutez le SDK modifié pour AIR 2.</p>
<p>Et maintenant, la création du projet :<br />
Nouveau projet Flex : Application Type : Desktop / AIR, SDK version : 4.0 ( celle avec mise à jour du SDK AIR 2  )</p>
<p><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/flextouchproject.jpg" alt="flextouchproject" title="flextouchproject" width="619" height="372" class="alignnone size-full wp-image-1644" /></p>
<h2>AS3 et le multi-toucher, comment çà marche ?</h2>
<p>Premièrement, on trouve maintenant dans le package flash.ui une nouvelle classe <b>Multitouch</b>.<br />
Elle permet de tester les <b>compatibilités de l&#8217;environnement</b> ( nombre de pressions/doigts gérés, combinaisons tactiles gérés&#8230; ) , et de définir le <b>&laquo;&nbsp;mode tactile&nbsp;&raquo;</b> : Gesture ou TouchPoint.<br />
Ce dernier précise si l&#8217;on veut capter les &laquo;&nbsp;combinaisons tactiles&nbsp;&raquo; classiques : Rotation, Glisser, Zoom et &laquo;&nbsp;Grand coup&nbsp;&raquo; ( NDLR = Swipe, déplacement de trois pression/doigts ) ou le détail de chaque pression/doigts. Dans la beta actuelle, <strong>seul Windows 7 permet la gestion du mode &laquo;&nbsp;TouchPoint&nbsp;&raquo;</strong>, les utilisateurs de OSX devront se &laquo;&nbsp;contenter&nbsp;&raquo; des combinaisons classiques.</p>
<pre class="brush: js">
trace( &#039;max touch : &#039; , Multitouch.maxTouchPoints );
trace( &#039;supportsGestureEvents : &#039; , Multitouch. supportsGestureEvents );
trace( &#039;supportsTouchEvents : &#039; , Multitouch. supportsTouchEvents );
trace( &#039;supportedGestures : &#039; , Multitouch. supportedGestures );
if( Multitouch. supportsTouchEvents )
     Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
// par défaut = MultitouchInputMode.GESTURE
</pre>
<p><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/gesturesvisualisation.jpg" alt="gesturesvisualisation" title="gesturesvisualisation" width="595" height="134" class="alignnone size-full wp-image-1634" /></p>
<p>Ensuite c&#8217;est l&#8217;autoroute :ajout des écouteurs d&#8217;événements qui vont bien, et c&#8217;est bon&#8230; tu peux caresser ton flex. Chaque transformGestureEvent contient, en fonction de son type, un offSetX/offSetY ( pan &#038; swipe ), un scaleX/scaleY ( zoom ) ou une rotation.</p>
<pre class="brush: js">
// gestures prises en charge par OSX 10.6 avec FP 10.1 b2
interactiveObject.addEventListener( TransformGestureEvent.GESTURE_PAN, onGesture );
interactiveObject.addEventListener( TransformGestureEvent.GESTURE_SWIPE, onGesture );
interactiveObject.addEventListener( TransformGestureEvent.GESTURE_ROTATE, onGesture );
interactiveObject.addEventListener( TransformGestureEvent.GESTURE_ZOOM, onGesture );

public function onGesture( e:TransformGestureEvent ):void
{
     // phase = GesturePhase.BEGIN, GesturePhase.UPDATE ou GesturePhase.END
     trace( &#039;Gesture :&#039;, e.type, &#039; phase :&#039;, e.phase );

     // tu fais des trucs en fonctions du types de toucher
     switch( e.type )
     {
           case TransformGestureEvent.GESTURE_PAN:
                  interactiveObject.x += e.offsetX;
                  interactiveObject.y += e.offsetY;
           break;

           case TransformGestureEvent.GESTURE_SWIPE: // déplace de 50 pixels
                  interactiveObject.x += e.offsetX * 50;
                  interactiveObject.y += e.offsetY * 50;
           break;

           case TransformGestureEvent.GESTURE_ZOOM:
                  interactiveObject.scaleX +=  e.scaleX - 1 ;
                  interactiveObject.scaleY +=  e.scaleY - 1 ;
           break;

           case TransformGestureEvent.GESTURE_ROTATE:
                  interactiveObject.rotation += e.rotation;
           break;
     }
}
</pre>
<p>Plutôt simple, mais plein de potentiel&#8230;</p>
<p><object width="600" height="361"><param name="movie" value="http://images.tv.adobe.com/swf/player.swf"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="FlashVars" value="fileID=5117&#038;context=145&#038;embeded=true&#038;environment=production"></param><embed src="http://images.tv.adobe.com/swf/player.swf" flashvars="fileID=5117&#038;context=145&#038;embeded=true&#038;environment=production" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="351"></embed></object></p>
<p>Avec ces 4 gestures on peut quand même &laquo;&nbsp;gérer&nbsp;&raquo; 8 + 4 + 2 + 2 soit 16 combinaisons si on prend en compte les directions de chaque gesture. Exemple : SWIPE horizontal = 1 fonction, SWIPE vertical = 1 autre, PAN horizontal = 1 fonction&#8230;<br />
L&#8217;exemple du magazine interactif pourrait par exemple parfaitement bénéficier de ces différentes combinaisons. À ce niveau tout un vocabulaire tactile reste à imaginer/compléter.</p>
<p>Bref, moi je suis bien content de pouvoir me caresser le flex !!!</p>
<h2>GestureTracker</h2>
<p>Par contre, en vrai novice de la programmation orientée caresse, mes premières touches furent, comment dire&#8230; hésitantes; du coup je me suis créé un petit assistant pour m&#8217;aider à la tâche, ou à la touche : le <b>GestureTracker</b>, un petit système de notification de gestures. Le but : <b>calculer et visualiser les gestures en cours, leur valeurs et les transformations globales appliquées</b>.</p>
<img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/gesturenotification.jpg" alt="GestureTracker" title="gesturenotification" width="620" height="256" class="size-full wp-image-1638" />
<p>Pour le moment c&#8217;est pour les projets AIR 2 sous Flex 4,  la version AS3 à suivre&#8230;</p>
<p>C&#8217;est tout pour le moment,  v&#8217;là pour <a href="http://lafabrick.com/labz/gesturetracker/GestureNotifier.air.zip">l&#8217;exemple air</a> ( <a href="http://labs.adobe.com/technologies/air2/"> AIR Runtime 2.0 beta 2 est requis</a>) , le <a href="http://lafabrick.com/labz/gesturetracker/GestureTracker.zip">swc du SparkGestureTracker</a> et les <a href="http://lafabrick.com/labz/gesturetracker/srcview/">sources</a>.</p>
<p>Pour plus d&#8217;infos :<br />
<a href="http://www.adobe.com/devnet/flash/articles/multitouch_gestures_print.html">Un tuto sur le multitouch</a> ,  une <a href="http://theflashblog.com/?p=1678">partie des réponses aux nombreuses interrogations</a> sur les compatibilités actuelles et à venir.</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/11/15/266-debuguer-un-projet-flex-distant-via-flex-builder/" rel="bookmark" title="15 novembre 2007">L&#8217;erreur est humaine&#8230; debuguer un projet Flex distant via Flex Builder</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/05/04/1130-interfaces-tangibles-le-futur-du-multitouch/" rel="bookmark" title="4 mai 2009">Interfaces tangibles : le futur du multitouch</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/10/09/1286-max-09-le-multitouch/" rel="bookmark" title="9 octobre 2009">MAX 09 &#8211; Le multitouch</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/" rel="bookmark" title="21 octobre 2010">RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</a></li>
</ul>
<p><!-- Similar Posts took 12.553 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/02/19/1609-flashplayer-101-et-multi-toucher-caresse-moi-le-flex/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>uigfx project : Flex4 primitives library / Fireworks extension</title>
		<link>http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/</link>
		<comments>http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 10:40:17 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[graphics]]></category>
		<category><![CDATA[primitives]]></category>
		<category><![CDATA[skin]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1964</guid>
		<description><![CDATA[I just released a new project, called by Erick uigfx, that I have introduced in my previous post (in french). So : it&#8217;s a Flex4 primitives&#8217;s library, which allows you to extend standard graphics primitives. It&#8217;s also one (and more soon) Fireworks extension to accelerate and improve the workflow between designer and developer. The existence [...]]]></description>
			<content:encoded><![CDATA[<p>I just released a<a href="http://code.google.com/p/uigfx/"> new project</a>, called by <a href="http://twitter.com/rick_lafabrick">Erick</a> <b>uigfx</b>, that I have introduced in my previous post (in french).<br />
So : it&#8217;s a Flex4 primitives&#8217;s library, which allows you to extend standard graphics primitives. It&#8217;s also one (and more soon) Fireworks extension to accelerate and improve the workflow between designer and developer.<br />
The existence of this library have just this idea: improve the work processes between teams around a Flex4 project.<br />
<span id="more-1964"></span></p>
<h2>uigfx library</h2>
<h3>ExclusionRect</h3>
<p>Draw a rectangle with rounded corners (&laquo;&nbsp;radius&nbsp;&raquo; property), with a rounded rectangular punch optional.<br />
The roundness of the inner rectangle is defined by &laquo;&nbsp;innerRadius&nbsp;&raquo; property.<br />
Constraints of the inner rectangle are defined with &laquo;&nbsp;innerTop&nbsp;&raquo;, &laquo;&nbsp;innerBottom, &laquo;&nbsp;innerLeft&nbsp;&raquo; and &laquo;&nbsp;innerRight&nbsp;&raquo; properties.<br />
Sample :</p>
<pre class="brush: xml">
&lt;uigfx:ExclusionRect
    radius=&quot;10&quot;
    innerRadius=&quot;30&quot;
    top=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; bottom=&quot;0&quot;
    innerTop=&quot;0&quot; innerBottom=&quot;20&quot; innerLeft=&quot;0&quot; innerRight=&quot;20&quot;&gt;

    &lt;uigfx:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color=&quot;#212121&quot; ratio=&quot;0&quot; /&gt;
            &lt;s:GradientEntry color=&quot;#313131&quot; ratio=&quot;1&quot;/&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; inner=&quot;true&quot;
            distance=&quot;1&quot; blurX=&quot;4&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/uigfx:filters&gt;

&lt;/uigfx:ExclusionRect&gt;
</pre>
<p>Result :<br />
<center><img alt="excluded rectangle" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/excludedrect.png" title="excludedRect" class="aligncenter" width="239" height="238" /></center></p>
<h3>PointsPath</h3>
<p>This primitive allows you to draw a path, based on a list of points(ConstraintPoint). <br />Additionally, you can set a roundness to your primitive using the &laquo;&nbsp;radius&nbsp;&raquo; property</p>
<p>A PointsPath can be defined as &laquo;&nbsp;not closed&nbsp;&raquo; : in this case you can use the &laquo;&nbsp;closedPath&nbsp;&raquo; property and set it to false :</p>
<pre class="brush: xml">
&lt;uigfx:PointsPath radius=&quot;60&quot; closedPath=&quot;false&quot;&gt;
   ...
&lt;/uigfx:PointsPath&gt;
</pre>
<h4>Using constraint point</h4>
<p>The ConstraintPoint class defines a point with constraints values (left, horizontalCenter, right; and top, verticalCenter, bottom) </p>
<pre class="brush: xml">
&lt;uigfx:ConstraintPoint top=&quot;0&quot; horizontalCenter=&quot;0&quot; /&gt;
</pre>
<p>Every single value can be expressed as a percentage, setting &laquo;&nbsp;valuesInPercent&nbsp;&raquo; property to &laquo;&nbsp;true&nbsp;&raquo; (by default, all values are expressed in pixel) :</p>
<pre class="brush: xml">
&lt;uigfx:ConstraintPoint valuesInPercent=&quot;true&quot; top=&quot;10&quot; horizontalCenter=&quot;-25&quot; /&gt;
</pre>
<h4>Sample</h4>
<p>Draw a five branch star, with a rounded contour (&laquo;&nbsp;radius&nbsp;&raquo; property), and constraints points vector :</p>
<pre class="brush: xml">
&lt;uigfx:PointsPath
    radius=&quot;60&quot; width=&quot;100%&quot; height=&quot;100%&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;

    &lt;uigfx:points&gt;
        &lt;uigfx:ConstraintPoint top=&quot;0&quot; horizontalCenter=&quot;0&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;25&quot; verticalCenter=&quot;-25&quot;/&gt;
        &lt;uigfx:ConstraintPoint right=&quot;0&quot; verticalCenter=&quot;-25&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;40&quot; verticalCenter=&quot;25&quot; /&gt;
        &lt;uigfx:ConstraintPoint right=&quot;40&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;0&quot; verticalCenter=&quot;40&quot; /&gt;
        &lt;uigfx:ConstraintPoint left=&quot;40&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;-40&quot; verticalCenter=&quot;25&quot; /&gt;
        &lt;uigfx:ConstraintPoint left=&quot;0&quot; verticalCenter=&quot;-25&quot; /&gt;
        &lt;uigfx:ConstraintPoint horizontalCenter=&quot;-25&quot; verticalCenter=&quot;-25&quot; /&gt;
    &lt;/uigfx:points&gt;

    &lt;uigfx:fill&gt;
        &lt;s:SolidColor color=&quot;#353535&quot; /&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; inner=&quot;true&quot; distance=&quot;1&quot;
            blurX=&quot;4&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/uigfx:filters&gt;

&lt;/uigfx:PointsPath&gt;
</pre>
<p>Result :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/fivestar.png" alt="fivestar" title="fivestar" width="291" height="324" class="aligncenter size-full wp-image-1557" /></center></p>
<h3>ComplexPointsPath</h3>
<p>This primitive allows you to draw a path with one or more contours, defined by ComplexConstraintPoint points. </p>
<h4>Define a complex point</h4>
<p>The ComplexConstraintPoint class defines a vector with a constraint position, and the position of its bezier curves list.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/vectoranchor.png" alt="vectoranchor" title="vectoranchor" width="291" height="191" class="aligncenter size-full wp-image-1553" /></center><br />
The position of bezier curves is defined by vertical and horizontal offsets as below :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/vectoranchoroffset.png" alt="vectoranchoroffset" title="vectoranchoroffset" width="229" height="263" class="aligncenter size-full wp-image-1554" /></center><br />
In mxml : </p>
<pre class="brush: xml">
&lt;uigfx:ComplexConstraintPoint
    horizontalCenter=&quot;-48&quot; verticalCenter=&quot;-59&quot;
    nextAnchorOffsetX=&quot;-2&quot; nextAnchorOffsetY=&quot;4&quot;
    prevAnchorOffsetX=&quot;7&quot; prevAnchorOffsetY=&quot;-6&quot; /&gt;
</pre>
<p>Just like the ConstraintPoint, all values can be expressed in percentage :</p>
<pre class="brush: xml">
&lt;uigfx:ComplexConstraintPoint
    valuesInPercent=&quot;true&quot;
    top=&quot;10&quot; horizontalCenter=&quot;-25&quot;
    nextAnchorOffsetX=&quot;-2&quot; nextAnchorOffsetY=&quot;4&quot;
    prevAnchorOffsetX=&quot;7&quot; prevAnchorOffsetY=&quot;-6&quot; /&gt;
</pre>
<h4>Single contour</h4>
<p>Draw a path with a complex contour :</p>
<pre class="brush: xml">
&lt;uigfx:ComplexPointsPath top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; &gt;
    &lt;uigfx:points&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; prevAnchorOffsetX=&quot;4.59&quot; top=&quot;36&quot; prevAnchorOffsetY=&quot;5.36&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-35&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-23&quot; bottom=&quot;18&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;3&quot; bottom=&quot;2&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;2&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; bottom=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; top=&quot;0&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;34&quot; nextAnchorOffsetX=&quot;6.07&quot; top=&quot;0&quot; nextAnchorOffsetY=&quot;4.56&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;44&quot; top=&quot;20&quot; nextAnchorOffsetY=&quot;13.81&quot; prevAnchorOffsetY=&quot;-8.18&quot; /&gt;
        &lt;uigfx:ComplexConstraintPoint left=&quot;19&quot; nextAnchorOffsetX=&quot;-7.6&quot; prevAnchorOffsetX=&quot;13.81&quot; top=&quot;45&quot; /&gt;
    &lt;/uigfx:points&gt;

    &lt;uigfx:stroke&gt;
        &lt;s:SolidColorStroke color=&quot;#ffffff&quot; weight=&quot;1&quot; /&gt;
    &lt;/uigfx:stroke&gt;

    &lt;uigfx:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color=&quot;#333333&quot; ratio=&quot;0&quot; alpha=&quot;1&quot;/&gt;
            &lt;s:GradientEntry color=&quot;#212121&quot; ratio=&quot;1&quot; alpha=&quot;1&quot;/&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
        &lt;s:GlowFilter color=&quot;#000000&quot; blurX=&quot;12&quot; blurY=&quot;12&quot; alpha=&quot;0.65&quot;/&gt;
    &lt;/uigfx:filters&gt;
&lt;/uigfx:ComplexPointsPath&gt;
</pre>
<p>result :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/complexpath.png" alt="complexpath" title="complexpath" width="316" height="115" class="aligncenter size-full wp-image-1556" /></center></p>
<h4>Multiples contours</h4>
<p>Draw a path with multiples contours.<br />
Each Contour object defines a part of the path. Basically, it&#8217;s used to process pathfinding, such as union or exclusion.<br />
Each contour is defined on a Contour object, through the &laquo;&nbsp;contours&nbsp;&raquo; collection property. Like PointsPath, a Contour can be defined as unclosed, using &laquo;&nbsp;closedContour&nbsp;&raquo; property :</p>
<pre class="brush: xml">
&lt;uigfx:ComplexPointsPath top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; &gt;
    &lt;uigfx:contours&gt;
        &lt;uigfx:Contour closedContour=&quot;false&quot;&gt;
            &lt;uigfx:points&gt;
            ...
</pre>
<p>Below a complete sample code : </p>
<pre class="brush: xml">
&lt;uigfx:ComplexPointsPath top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot; &gt;
    &lt;uigfx:contours&gt;
        &lt;uigfx:Contour&gt;
            &lt;uigfx:points&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; prevAnchorOffsetX=&quot;4.59&quot; top=&quot;36&quot; prevAnchorOffsetY=&quot;5.36&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;0&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-35&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;-23&quot; bottom=&quot;18&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;3&quot; bottom=&quot;2&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint horizontalCenter=&quot;2&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; bottom=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;0&quot; top=&quot;0&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;34&quot; nextAnchorOffsetX=&quot;6.07&quot; top=&quot;0&quot; nextAnchorOffsetY=&quot;4.56&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;44&quot; top=&quot;20&quot; nextAnchorOffsetY=&quot;13.81&quot; prevAnchorOffsetY=&quot;-8.18&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint left=&quot;19&quot; nextAnchorOffsetX=&quot;-7.6&quot; prevAnchorOffsetX=&quot;13.81&quot; top=&quot;45&quot; /&gt;
            &lt;/uigfx:points&gt;
        &lt;/uigfx:Contour&gt;
        &lt;uigfx:Contour&gt;
            &lt;uigfx:points&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;96&quot; top=&quot;18&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;68&quot; top=&quot;9&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;59&quot; top=&quot;37&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;87&quot; top=&quot;46&quot; /&gt;
            &lt;/uigfx:points&gt;
        &lt;/uigfx:Contour&gt;
        &lt;uigfx:Contour&gt;
            &lt;uigfx:points&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;49&quot; bottom=&quot;28&quot; nextAnchorOffsetY=&quot;-11.87&quot; prevAnchorOffsetY=&quot;11.87&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;28&quot; nextAnchorOffsetX=&quot;11.87&quot; prevAnchorOffsetX=&quot;-11.87&quot; bottom=&quot;49&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;6&quot; bottom=&quot;28&quot; nextAnchorOffsetY=&quot;11.87&quot; prevAnchorOffsetY=&quot;-11.87&quot; /&gt;
                &lt;uigfx:ComplexConstraintPoint right=&quot;28&quot; nextAnchorOffsetX=&quot;-11.87&quot; prevAnchorOffsetX=&quot;11.87&quot; bottom=&quot;6&quot; /&gt;
            &lt;/uigfx:points&gt;
        &lt;/uigfx:Contour&gt;
    &lt;/uigfx:contours&gt;

    &lt;uigfx:stroke&gt;
        &lt;s:SolidColorStroke color=&quot;#ffffff&quot; weight=&quot;2&quot; /&gt;
    &lt;/uigfx:stroke&gt;

    &lt;uigfx:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color=&quot;#333333&quot; ratio=&quot;0&quot; alpha=&quot;1&quot;/&gt;
            &lt;s:GradientEntry color=&quot;#212121&quot; ratio=&quot;1&quot; alpha=&quot;1&quot;/&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/uigfx:fill&gt;

    &lt;uigfx:filters&gt;
       &lt;s:GlowFilter color=&quot;#000000&quot; blurX=&quot;12&quot; blurY=&quot;12&quot; alpha=&quot;0.65&quot;/&gt;
    &lt;/uigfx:filters&gt;
&lt;/uigfx:ComplexPointsPath&gt;
</pre>
<p>Result :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/complexpathmultiples.png" alt="complexpathmultiples" title="complexpathmultiples" width="309" height="222" class="aligncenter size-full wp-image-1555" /></center></p>
<h2>An Extension for Fireworks</h2>
<p>This library would not be complete without an export tools for Fireworks. Have a complex primitive is good, but how to find all the points and bezier curves without a headache? It&#8217;s the goal of this extension!</p>
<p>At this moment the exporter is able to : </p>
<ul>
<li>exports all paths and rectangles</li>
<li>exports strokes</li>
<li>exports fills (solid color and gradient)</li>
<li>exports filters (gaussian blur, glow, drop shadow) </li>
</ul>
<p>But for now, this exporter can&#8217;t :</p>
<ul>
<li>exports text </li>
</ul>
<h3>Installation</h3>
<p>Simply <a href="https://code.google.com/p/uigfx/downloads/list">download the extension</a> (uigfx.mxp), and double click on it to launch the Extension Manager. The installation is automatic. Now, open Fireworks, and open the primitives exporter panel in  &laquo;&nbsp;<b>Window > uigfx</b>&laquo;&nbsp;.</p>
<h3>How to use this extension</h3>
<ul>
<li><b>Make your design</b></li>
<li><b>Generate and place rules</b><br />
You&#8217;ill need 4 vertical rules and 4 horizontal rules to determine all constraints positions of each vector point. You can click on the &laquo;&nbsp;generate rules button&nbsp;&raquo;, to put the rules around your selection (you need to select one or more objects). Move the rules, in order to have all vectors in the good area, like below : <br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/02/constraintsposition.jpg" alt="constraintsposition" title="constraintsposition" width="567" height="401" class="aligncenter size-full wp-image-1558" /></center></li>
<li><b>Export</b><br />
Click on the export button to export all selections. The exporter follows rules placement to determine vectors positions. If there&#8217;s no selection, all layers are exported. Of course, you will have to provide a name for the output file and a directory to save it in.<br />
Finally, an mxml file, containing a Spark Skin with all uigfx primitives, will be created. And voila !</li>
</ul>
<p><b>This project is <a href="http://code.google.com/p/uigfx/">hosted on google code</a>.</b>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/" rel="bookmark" title="4 décembre 2009">Flex4 : skin et primitives</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/" rel="bookmark" title="23 juillet 2010">Primitive DashedLine : une petite ligne bien utile</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/" rel="bookmark" title="23 juin 2011">Fireworks + Javascript = Spark Skin Pleasure !</a></li>
</ul>
<p><!-- Similar Posts took 15.957 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Object to XML to Object : conversion XSD</title>
		<link>http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/</link>
		<comments>http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 21:38:47 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1492</guid>
		<description><![CDATA[Utiliser les schéma de déclaration XSD, s’avère souvent fort utile. Plus que l’autocompletion sur vos fichiers XML, l’apport des XSD se trouve avant tout dans le fait de qualifier et de valider vos fichiers. Dans Flex, bien que caché au fin fond du package rpc, la mécanique de lecture et de conversion XSD est bien [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/back.png" alt="back" title="back" width="520" height="120" class="aligncenter size-full wp-image-1507" /></center><br />
Utiliser les schéma de déclaration XSD, s’avère souvent fort utile. Plus que l’autocompletion sur vos fichiers XML, l’apport des XSD se trouve avant tout dans le fait de qualifier et de valider vos fichiers. Dans Flex, bien que caché au fin fond du package rpc, la mécanique de lecture et de conversion XSD est bien là. Nous allons voir comment l’utiliser, et convertir vos objets AS3 vers XML (et vice versa), en suivant ces schémas de définition.<br />
<span id="more-1492"></span></p>
<h2>Pourquoi utiliser une XSD?</h2>
<p>Pour ma part, ces quelques raisons (et pour vous certainement plein d’autres raisons) </p>
<ul>
<li>Elle valide vos XML : parce que vous définissez en amont la structure de vos fichiers, une définition XSD permet de les valider;</li>
<li>Parce que vous avez besoin de plusieurs écritures différentes d’un même jeu de donnés;</li>
<li>Parce que, comme tout bon dèv, vous êtes fainéant&#8230;</li>
<li>&#8230;et le fait que le programme valide tout et fait tout, tout seul, en suivant des règles normées ça vous va bien.</li>
<li>Ca fait toujours bien d’avoir des fichiers XSD dans vos sources : ça envoie de la rosette, et vous pouvez vous la péter grave.</li>
<li>&#8230;</li>
</ul>
<p>Dans un usage Flex, l’objectif serait de pouvoir transformer nos objets AS en XML, et l’inverse, via les schémas de définitions. Ça tombe bien ! C’est ce qu’on va faire.</p>
<h2>Où tu te caches XSD ?!</h2>
<p>Dans la plupart des langages, nous avons la possibilité de discuter avec notre serveur en utilisant le protocole SOAP, basé sur XML. En utilisant ce protocole, nos objets sont “transformés” en XML, et transmis vers notre serveur. L’opération inverse existe lors de réception de données.<br />
Mais pourquoi je vous parle de ça? Tout simplement parce que tout langage faisant du SOAP (ou du web service), à besoin de valider et de convertir de manière automatique les objets. Et je vous le donne en mille, ce sont les définitions XSD qui entrent en jeux (souvent <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>La mécanique XSD est utilisée, en interne dans Flex, pour l’encodage et le décodage d’objet SOAP ou WSDL. Ces classes, exclues du framework (vous n’y avez pas accès directement avec l’autocomplétion), se trouvent dans le package mx.rpc.xml.*.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/rpcxml.png" alt="rpcxml" title="rpcxml" width="306" height="648" class="aligncenter size-full wp-image-1508" /></center><br />
Et c’est bien dommage que ces classes soit exclues !  Selon moi, elles seraient bien plus utiles ouvertes, documentées, et dans un package plus global comme flash.xml par exemple (flash.xsd ou flash.xml.xsd&#8230; ça pourrait être cool !). </p>
<p>Car vous allez le voir, il est relativement simple d’utiliser cette partie de Flex, pour un usage personnalisé du XML, en dehors du contexte RPC. </p>
<h2>Des groupes, des geeks, des bidules</h2>
<p>Donc c’est parti pour l’exemple. Je ne me casse pas la tête, et vous propose un biniou qui aura 3 éléments : des groupes, des gens (geek forcement), et des bidules&#8230; Je n’étais pas inspiré sur le 3ème éléments, mais il m’en fallait un&#8230;.</p>
<h3>XML et la définition XSD</h3>
<p>Nous avons une infinité d’écriture XML possible, comme celle-ci :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;groups&gt;
    &lt;group&gt;
        &lt;groupName&gt;klingons&lt;/groupName&gt;
        &lt;geeks&gt;
            &lt;geek&gt;
                &lt;firstName&gt;francis&lt;/firstName&gt;
                &lt;stuffs&gt;
                    &lt;stuff&gt;
                        &lt;name&gt;mac&lt;/name&gt;
                  &lt;/stuff&gt;
                   &lt;stuff&gt;
                        &lt;name&gt;Flex&lt;/name&gt;
                    &lt;/stuff&gt;
                &lt;/stuffs&gt;
            &lt;/geek&gt;
        &lt;/geeks&gt;
    &lt;/group&gt;

    &lt;group&gt;
        ...
&lt;/groups&gt;
</pre>
<p>Ou celle là :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;groups&gt;
    &lt;group groupName=&quot;klingons&quot;&gt;
        &lt;geeks&gt;
            &lt;geek firstName=&quot;francis&quot;&gt;
                &lt;stuffs&gt;
                    &lt;stuff name=&quot;mac&quot; /&gt;
                    &lt;stuff name=&quot;Flex&quot; /&gt;
                &lt;/stuffs&gt;
            &lt;/geek&gt;
            &lt;geek firstName=&quot;roger&quot;&gt;
                &lt;stuffs&gt;
                    &lt;stuff name=&quot;pc&quot; /&gt;
                    &lt;stuff name=&quot;photoshop&quot; /&gt;
                &lt;/stuffs&gt;
            &lt;/geek&gt;
        &lt;/geeks&gt;
    &lt;/group&gt;

    &lt;group&gt;
        ...
&lt;/groups&gt;
</pre>
<p>Ou un mélange à votre sauce, vous faites bien comme vous voulez !</p>
<p>Nous allons donc écrire notre XSD, qui va définir le XML définit ci-dessus, celui qui utilise pleins d’attributs. Je prend celui là parce que la sortie XML est moins longue&#8230;. et mon article gagnera quelques lignes&#8230;. En ce moment mes articles sont un peu trop pépère&#8230; Ca doit être l’approche des fêtes.</p>
<p>Bref !</p>
<p>Le but est de réaliser une XSD la plus complète possible, ou toutes les parties sont typées (SimpleType ou ComplexeType). C’est important pour la suite, car chaque type sera “mappé” avec la classe ActionScript qui lui correspond.</p>
<p>Dans notre exemple, nous avons 3 collections (groups geeks, stuffs) et 3 éléments (group, geek, stuff)&#8230; D’accord je ne me suis pas foulé les doigts sur ce coup là !</p>
<p>Le schéma XSD n’est finalement qu’un fichier XML standard : </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;xsd:schema
    xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;
    targetNamespace=&quot;schemas/geeks&quot;
    xmlns=&quot;schemas/geeks&quot;&gt;

    &lt;xsd:element name=&quot;groups&quot; type=&quot;groupsCollectionType&quot; /&gt;

&lt;/xsd:schema&gt;
</pre>
<p>L’élément principale, le noeud “&lt;groups&gt;”, est la base de notre schéma. Le type correspondant va s’appeler <strong>groupsCollectionType</strong>.</p>
<p>La version actionScript de ce type <strong>groupsCollectionType</strong> serait un Array ou ArrayCollection (ou tout autre type de collection d’objet).<br />
<strong>groupsCollectionType</strong> est une séquence, un réceptacle de 0 à n éléments de type group (le nombre d’instances minimum et maximun est défini par <strong>minOccurs</strong> et  <strong>maxOccurs</strong>).</p>
<pre class="brush: xml">
&lt;xsd:complexType name=&quot;groupsCollectionType&quot; mixed=&quot;true&quot;&gt;
    &lt;xsd:sequence&gt;
        &lt;xsd:element name=&quot;group&quot; type=&quot;groupType&quot;
            maxOccurs=&quot;unbounded&quot; minOccurs=&quot;0&quot; /&gt;
    &lt;/xsd:sequence&gt;
&lt;/xsd:complexType&gt;
</pre>
<p>Le type group est composé comme suit :</p>
<pre class="brush: xml">
&lt;xsd:complexType name=&quot;groupType&quot; mixed=&quot;true&quot;&gt;
    &lt;xsd:sequence&gt;
        &lt;xsd:element name=&quot;geeks&quot; type=&quot;geeksCollectionType&quot;
            minOccurs=&quot;0&quot; maxOccurs=&quot;1&quot;  /&gt;
    &lt;/xsd:sequence&gt;

    &lt;xsd:attribute name=&quot;groupName&quot; use=&quot;required&quot; type=&quot;xsd:string&quot; /&gt;

&lt;/xsd:complexType&gt;
</pre>
<p>On retrouve le noeud <strong>geeks</strong>, unique, mais non obligatoire (minOccurs=&nbsp;&raquo;0&#8243; maxOccurs=&nbsp;&raquo;1&#8243;), qui sera défini dans un type <strong>geeksCollectionType</strong> de la même manière que <strong>groupsCollectionType</strong>.<br />
Les attributs du noeud sont placé à la suite de la séquence d’éléments. Ils peuvent être requis ou optionnel, définit par l’attribut use. On peut aussi le définir “prohibited” même si je ne vois pas vraiment l’intérêt&#8230;</p>
<p>Et on continue comme cela, en rentrant en profondeur dans nos différent objets. La syntaxe n’est pas compliquée, il suffit de se pencher un peu sur <a href="http://www.w3.org/XML/Schema#dev">les spécifications de la W3C</a>. </p>
<p><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/geeks.xsd">Vous trouverez ici la XSD complète</a> de notre exemple.</p>
<h3>Côté ActionScript</h3>
<p>Nous avons besoin de 3 objets, qui correspondent aux 3 types d’éléments de notre XML : des groupes de Geek, des Geeks, des Stuffs.</p>
<p>Là, rien de plus basique.</p>
<ul>
<li>La classe <strong>GeekGroup </strong>: avec une propriété <strong>groupName</strong>, et une collection <strong>geeks </strong>(les geeks membres du groupe)</li>
<li>La classe <strong>Geek </strong>: avec une propriété <strong>firstName</strong>, et une collection <strong>stuffs</strong> (les bidules du geek)</li>
<li>La classe <strong>Stuff</strong> : avec une propriété <strong>name</strong>, le nom du bidule</li>
</ul>
<p>Vous vous rendez compte, tout d’un coup, que je ne vous ai absolument rien appris dans ce paragraphe. Passons à la suite.</p>
<h2>Les classes de gestion XSD</h2>
<p>Nous avons une XSD et des objets AS prêts à être convertis. Regardons de plus près les classes exclues dont nous avons besoin:</p>
<ul>
<li><strong>mx.rpc.xml.SchemaTypeRegistry</strong> : cette classe est une sorte de dictionnaire, ou l’on référence les différents types du schéma XSD, avec leurs classes actionScript associées.</li>
<li><strong>mx.rpc.xml.XMLDecoder</strong> : la classe qui permet de décoder une source XML, en suivant la XSD, vers un object typé actionScript.</li>
<li><strong>mx.rpc.xml.XMLEncoder</strong> : la classe qui permet d’encoder un objet AS en un fichier XML, en suivant la définition XSD.</li>
<li><strong>mx.rpc.xml.Schema</strong> : la classe contenant le schema XSD chargé.</li>
<li><strong>mx.rpc.xml.SchemaManage</strong>r : point central du système, cette classe est utilisée par l’encodeur et le décodeur. Elle possède une référence au schéma (elle peut d&#8217;ailleurs contenir plusieurs schéma XSD), et utilise les références de classes et de type XSD enregistrés dans mx.rpc.xml.SchemaTypeRegistry.</li>
</ul>
<h2>Votre object en XML, via XSD</h2>
<p>Dans un premier temps, il nous faut charger la définition XSD via un URLLoader : </p>
<pre class="brush: js">
var urlLoader : URLLoader = new URLLoader();
urlLoader.addEventListener( Event.COMPLETE, onLoadXsdComplete );
urlLoader.load( new URLRequest( &quot;geek.xsd&quot; ) );	
</pre>
<p>A la réception de la XSD, nous initialisons la classe Schema et le SchemaManager :</p>
<pre class="brush: js">
var _schema:Schema = new Schema();
var _schemaManager:SchemaManager = new SchemaManager();

_schema.xml = XML( urlLoader.data );
_schemaManager.addSchema( _schema );
</pre>
<p>Nous ajoutons la référence du manager de schéma dans nos objets d’encodage/décodage :</p>
<pre class="brush: js">
var _xmlDecoder:XMLDecoder = new XMLDecoder();
var _xmlEncoder:XMLEncoder = new XMLEncoder();

_xmlDecoder.schemaManager = _schemaManager;
_xmlEncoder.schemaManager = _schemaManager;
</pre>
<p>Ensuite, nous référençons les types contenus dans la XSD, avec les classes AS correspondantes : </p>
<pre class="brush: js">
var _schemaTypeRegistry : SchemaTypeRegistry;
_schemaTypeRegistry = SchemaTypeRegistry.getInstance();

_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;groupsCollectionType&quot;), ArrayCollection);
_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;groupType&quot;), GeekGroup);

_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;geeksCollectionType&quot;), ArrayCollection);
_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;geekType&quot;), Geek);

_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;stuffCollectionType&quot;), ArrayCollection);
_schemaTypeRegistry.registerClass(
    new QName(_schema.targetNamespace.uri, &quot;stuffType&quot;), Stuff);
</pre>
<p>Enfin, nous récupérons notre XML tout bien valide, image de l’objet targetObject, via l’encodeur XML (il faut préciser le nom du noeud “root” de la XSD) : </p>
<pre class="brush: js">
var xmlList : XMLList = _xmlEncoder.encode( targetObject,
    new QName( _schema.targetNamespace.uri, &quot;groups&quot;) );
</pre>
<p>Super simple.</p>
<h2>D&#8217;un XML vers un Object</h2>
<p>C’est magique, c’est tout pareil ! au lieu d’utiliser XMLEncoder, on utilise XMLDecoder, et on change la référence de l’objet par notre XML : </p>
<pre class="brush: js">
var obj : ArrayCollection = _xmlDecoder.decode( myXml,
    new QName( _schema.targetNamespace.uri, &quot;groups&quot;) ) as ArrayCollection;
</pre>
<h2>Automatisation</h2>
<p>Je vous propose un set de classes pour faire tout ça de manière automatique. </p>
<ul>
<li><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/com/lafabrick/converter/XSDConverter.as.html">XSDConverter</a> : un convertisseur XML via XSD.<br />
2 méthodes : </p>
<ul>
<li>importFromXml( xml : *, xsdUrl : String, schemaTypes : Vector.<XSDType> = null ) : void</li>
<li>exportToXml( target : Object, xsdUrl : String, schemaTypes : Vector.<XSDType> = null ) : void</li>
</ul>
<p>En paramètre de ces méthodes : </p>
<ul>
<li><strong>la source</strong> : Object pour l’exportation, une String, un XML ou un XMLList pour l’importation;</li>
<li><strong>xsdUrl</strong> : l’url de la xsd a charger;</li>
<li><strong>schemaType</strong> : une collection (Vector) d’objet de type XSDType, définissant le mapping entre les types XSD, et les classes référentes AS.</li>
</ul>
</li>
<li><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/com/lafabrick/converter/XSDEvent.as.html">XSDEvent</a> : l’évènement diffusé par XSDConverter (importSuccess, exportSuccess et conversionError (en cas de problème de conversion ou de chargement de la XSD ) ).</li>
<li><a href="http://www.lafabrick.com/labz/xsdconverter/srcview/source/com/lafabrick/converter/XSDType.as.html">XSDType</a> : définition d’un type XSD, avec la classe AS associée.</li>
</ul>
<p><a href="http://www.lafabrick.com/labz/xsdconverter/">Un petit exemple est disponible là</a>, avec <a href="http://www.lafabrick.com/labz/xsdconverter/srcview/index.html">les sources sous ce lien</a>.</p>
<h2>Et donc&#8230;.</h2>
<p>&#8230; vous pouvez vous dire que  “Ahh ! Maintenant que mes données sont automatiquement transformées en XML, je me sens mieux. Et comme j’ai gagné plein de temps, ba du coup je peux lire des articles fort intéressants comme ceux concernant <a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/">le skinning</a> ou <a href="http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/">les primitives dans Flex4</a>. De toutes façons y’a trop de monde à la Fnac pour finir mes cadeaux&#8230;.”</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/06/301-tips-of-the-day-les-collectionevent/" rel="bookmark" title="6 février 2008">Pti truc du jour : Les CollectionEvent</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/10/288-cairngorm-pour-les-fainants-tour-d-horizons-des-code-generator/" rel="bookmark" title="10 janvier 2008">Cairngorm pour les fainéants&#8230; Tour d&#8217;horizons des code generator</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/21/999-what-is-adobe-cocomo/" rel="bookmark" title="21 janvier 2009">Developing with AFCS a.k.a Cocomo &#8211; Introduction</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/" rel="bookmark" title="15 janvier 2009">Reflex #2 : vous reprendrez bien un peu de IOC ?</a></li>
</ul>
<p><!-- Similar Posts took 13.814 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/12/14/1492-object-to-xml-to-object-conversion-xsd/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>MAX 09 &#8211; Sneak Peeks !</title>
		<link>http://www.lafabrick.com/blog/2009/10/09/1245-max-09-sneak-peeks/</link>
		<comments>http://www.lafabrick.com/blog/2009/10/09/1245-max-09-sneak-peeks/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 02:33:14 +0000</pubDate>
		<dc:creator>La Fabrick</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[Pure Style]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[MAX]]></category>
		<category><![CDATA[Sneak Peeks]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1245</guid>
		<description><![CDATA[Ah oui, au fait, juste avant de commencer : un mot sur les Awards. Nous avons eu droit à une présentation des MAX Awards par Mark Hamil juste avant la session Sneak Peeks. On ne reviens pas dessus tellement nous avons trouvé ça pauvre en information. Nous sommes certains que les projets choisis sont effectivement [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-1322" title="sneakpeeksmosaic" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/10/sneakpeeksmosaic.jpg" alt="sneakpeeksmosaic" width="512" height="192" /></p>
<p>Ah oui, au fait, juste avant de commencer : un mot sur les Awards. Nous avons eu droit à une présentation des MAX Awards par Mark Hamil juste avant la session Sneak Peeks. On ne reviens pas dessus tellement nous avons trouvé ça pauvre en information. Nous sommes certains que les projets choisis sont effectivement géniaux, mais nous n&#8217;avons vraiment pas eu l&#8217;occasion d&#8217;en voir suffisamment et d&#8217;en entendre parler leurs concepteurs pour se faire une quelconque idée de la chose.</p>
<p>Voici plutôt un aperçu de ces Sneak Peeks particulièrement intéressants sur les innovations en cours chez Adobe. Le principe est simple : prenez Mark Hamil (Luke Skywalker pour les intimes) comme présentateur qui ne comprend rien aux technologies montrées, déguisez les ingénieurs Adobe en chevaliers de l&#8217;empire, Chewbacca ou princesse Leïa et vous obtenez un show de geek vraiment sympa et impressionnant.</p>
<p><span id="more-1245"></span></p>
<h2>Principe</h2>
<p>Chaque équipe passe présenter son projet et doit rivaliser d&#8217;idées innovantes pour obtenir les clameurs de la foule en folie. Ca va vite, ils font souvent des blagues et vont parfois jusqu&#8217;à scénariser la présentation. C&#8217;est vraiment excellent ! Les infos passent très bien, on ne s&#8217;ennuie pas&#8230; Voyons voir.</p>
<h2>Mobile</h2>
<p>L&#8217;équipe mobile nous a présenté un jeu multi-joueurs utilisable depuis différents terminaux mobiles (Palm, Google Android, Nokia&#8230;), une application AIR sur portable et en mode web sur PC. Le principe technique est que ce jeu s&#8217;exécute côté serveur et que les images du jeu sont envoyées en streaming sur les terminaux (un peu comme une vidéo YouTube). Chaque commande est également envoyée au serveur pour lui permettre de calculer le comportement attendu pour le joueur.</p>
<p>Même si la technicité est certainement élevée et innovante, la pauvre bande passante du Wi-Fi disponible a montré les lacunes de l&#8217;outil. L&#8217;intérêt reste à notre sens assez limité, bien que nous ne soyons pas des spécialistes du jeu en ligne. On salue quand même la performance (faut le faire non ?)</p>
<h2>Flash</h2>
<p><img class="size-thumbnail wp-image-133" style="float: left; border: none" title="Flash pro" src="http://herve.lafabrick.com/blog/wp-content/uploads/2009/10/Fl-150x150.jpg" alt="Flash pro" width="54" height="54" /><img style="float: right;" title="Chewbacca" src="http://herve.lafabrick.com/blog/wp-content/uploads/2009/10/IMG_3276-300x225.jpg" alt="Chewbacca" width="138" height="104" />La démo Flash est assurée par Chewbacca en personne. Il nous montre comment la future version de Flash Professionnel permettra de générer des animations de formes à l&#8217;aide d&#8217;un moteur physique pour leur donner un aspect particulièrement réaliste. L&#8217;exemple ci-après est réalisé à partir de dessins de formes vectoriel et d&#8217;activation de quelques cases à cocher&#8230;</p>
<p style="text-align: center; "><object width="425" height="344" data="http://www.youtube.com/v/6SqZydjxziI&amp;hl=fr&amp;fs=1&amp;rel=0&amp;color1=0x5d1719&amp;color2=0xcd311b" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/6SqZydjxziI&amp;hl=fr&amp;fs=1&amp;rel=0&amp;color1=0x5d1719&amp;color2=0xcd311b" /><param name="allowfullscreen" value="true" /></object></p>
<p>On vous laisse imaginer les possibilités offertes au designer pour réaliser des animations réalistes et relativement complexes en quelques clics, c&#8217;est vraiment intéressant pour le monde de la création.</p>
<h2>Flex pour mobile</h2>
<p><img class="size-thumbnail wp-image-135" style="float: left; border: none" title="Fx" src="http://herve.lafabrick.com/blog/wp-content/uploads/2009/10/Fx-150x150.jpg" alt="Fx" width="54" height="54" />Cette fois, c&#8217;est princesse Leia qui procède à la présentation d&#8217;un développement en environnement Flex avec le framework mobile. Concrètement, il/elle utilise des composants liste et champ de recherche, compile et lance une application ressemblant plus que fortement à une application iPhone de recherche et affichage d&#8217;informations.</p>
<p><img class="aligncenter size-medium wp-image-126" title="Leia" src="http://herve.lafabrick.com/blog/wp-content/uploads/2009/10/IMG_3285-300x225.jpg" alt="Leia" width="300" height="225" /></p>
<p>Le résultat, affiché sur un iPhone (forcément&#8230;), est particulièrement réussi, très réactif. C&#8217;est impressionnant, en tant que développeurs Flex de voir la simplicité du développement Flex apportée sur un environnement de ce type !</p>
<h2>Photoshop</h2>
<p><img style="float: left; border: none" title="Ps" src="http://www.mti.epita.fr/blogs/wp-content/uploads/image1.png" alt="" width="61" height="61" />On ne sait plus à quoi s&#8217;attendre sur Photoshop. Le logiciel vit depuis un certain temps, et pourtant cette présentation nous a laissé sur le c&#8230; pardon, pantois.</p>
<p>Concrètement, l&#8217;équipe a travaillé sur une <strong>fonctionnalité de gommage intelligent (mathpatch)</strong>, interprétant la globalité de l&#8217;image pour remplacer le contenu supprimé par un contenu particulièrement réaliste. Le résultat est absolument hallucinant. Vous pouvez supprimer le fameux fil électrique qui rature le beau bâtiment à présent.</p>
<p>Ce fonctionnement a carrément été appliqué à des parties d&#8217;images : la démonstration montre le conférencier supprimer une usine de la vue de la photos. 20% de l&#8217;image est recomposée automatiquement. On constate déjà un peu plus l&#8217;intervention de la machine, mais en faisant attention. Bluffant !</p>
<h2>Fireworks</h2>
<p><img style="float: left; border: none" title="Fireworks" src="http://www.scl.utah.edu/computers/mac/software/images/softicons/Fireworks_CS3.png" alt="" width="64" height="64" />L&#8217;équipe Fireworks a présenté une fonctionnalité de <strong>retour arrière sur ses actions de manière ciblée</strong>. Concrètement, vous travaillez sur une partie de votre image, puis une seconde et ne voulez annuler que les changements effectués sur la première partie, mais pas sur la seconde, vous pouvez sélectionner ladite première partie et <strong>annuler uniquement ces changements</strong> : particulièrement pratique pour les designers habitués à ce genre d&#8217;outils !</p>
<h2>Dreamweaver</h2>
<p><img class="size-thumbnail wp-image-128" style="float: left; border: none" title="Dw" src="http://herve.lafabrick.com/blog/wp-content/uploads/2009/10/Dw-150x150.png" alt="Dw" width="63" height="63" />Nous n&#8217;avons pas particulièrement l&#8217;utilisation de Dreamweaver habituellement, mais on retient cette démonstration, particulièrement intéressante pour l&#8217;utilisation de la nouvelle norme HTML 5.</p>
<p>En l&#8217;occurrence, une nouvelle spécification est sortie (HTML 5) intégrant notamment un notion de Canvas, des interactions et animations pouvant être définies pour ce canvas. Adobe montre une forte volonté de tirer partie de cette nouvelle solution en permettant un <strong>copier coller depuis Flash dans Dreamweaver</strong> d&#8217;une animation Flash, Dreamweaver la transformant en animation native Canvas.</p>
<p>L&#8217;intérêt ? Pas de Flash Player, des performances excellentes, et une adéquation parfaite aux standards. Une excellente initiative pour tenter de se <strong>rapprocher du standard</strong> plutôt que chercher à l&#8217;évincer.</p>
<h2>AIR : Rome</h2>
<p><img class="size-thumbnail wp-image-129" style="float: left; border: none" title="AIR" src="http://herve.lafabrick.com/blog/wp-content/uploads/2009/10/AIR-150x150.png" alt="AIR" width="63" height="63" />Attention, énorme application. Le conférencier nous présente un outil à l&#8217;ergonomie particulièrement réfléchie et léchée regroupant en quelque sorte le principale de chaque outil d&#8217;Adobe. Vous pouvez dessiner en vectoriel (Illustrator / Fireworks), ajouter des animations (Flash), importer des calques Photoshop, ajouter des écrans et créer une interaction type navigation entre écrans (Flash Catalyst).</p>
<p>Enfin, vous pouvez exporter votre travail en SWF, AIR, SVG, image, page HTML, PDF&#8230; Tout cela étant, également fonctionnel en mode Internet : il y avait de la bave sur les sièges&#8230;</p>
<p>Pour nous, c&#8217;est le vainqueur. C&#8217;est absolument impressionnant à voir ! Ca montre notamment les capacités offertes par AIR et confirme son positionnement sur une application Internet mêlée à une application de bureau.</p>
<p style="text-align: center"><object width="425" height="344" data="http://www.youtube.com/v/nzXCadMUPCc&amp;hl=fr&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/nzXCadMUPCc&amp;hl=fr&amp;fs=1&amp;rel=0&amp;color1=0x006699&amp;color2=0x54abd6" /><param name="allowfullscreen" value="true" /></object>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/05/24/110-du-html-dans-mon-flex/" rel="bookmark" title="24 mai 2007">Du HTML dans mon Flex&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/01/459-live-from-max-milan-hands-on-thermo/" rel="bookmark" title="1 décembre 2008">Live from MAX Milan : hands on thermo&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/10/09/1286-max-09-le-multitouch/" rel="bookmark" title="9 octobre 2009">MAX 09 &#8211; Le multitouch</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/10/09/1243-max-09-ca-annonce/" rel="bookmark" title="9 octobre 2009">MAX 09 &#8211; Ça annonce !</a></li>
</ul>
<p><!-- Similar Posts took 13.309 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/10/09/1245-max-09-sneak-peeks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

