<?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; UI Design</title>
	<atom:link href="http://www.lafabrick.com/blog/tag/ui-design/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>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 11.689 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>Flex4 : skin et primitives</title>
		<link>http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/</link>
		<comments>http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:52:36 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[skinning]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1453</guid>
		<description><![CDATA[Dans le dernier article, nous avons fait un petit tour d’horizon du nouveau système de skin de Flex4. J’ai brièvement présenté EazeElement que j’utilise dans l’article. Nous allons maintenant rentrer un peu plus profondément dans les primitives, qui vous permettent de créer vos propres formes et autres éléments graphiques personnalisés. Retour sur les primitives Dans [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/bandeauskinprimitive.jpg" alt="bandeauskinprimitive" title="bandeauskinprimitive" width="520" height="132" class="aligncenter size-full wp-image-1480" /></center><br />
Dans le dernier article, nous avons fait un petit tour d’horizon du nouveau système de skin de Flex4. J’ai brièvement présenté EazeElement que j’utilise dans l’article. Nous allons maintenant rentrer un peu plus profondément dans les primitives, qui vous permettent de créer vos propres formes et autres éléments graphiques personnalisés.<br />
<span id="more-1453"></span></p>
<h2>Retour sur les primitives</h2>
<p>Dans Flex4, une Skin est une agglomération d’éléments graphiques, définis avec un type de ligne, de fond, et des filtres. L&#8217;objet graphique final est une superposition de rectangles, de lignes, d&#8217;ellipses, d’images, de formes complexes.</p>
<p>Intéressons nous à celles qui utilisent directement l’API de dessin : Rect, Ellipse, Line, Path</p>
<h3>Comment ça marche?</h3>
<p>L’architecture des primitives utilisant l’API de dessin est la suivante :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/organigrammeprimitives.png" alt="organigrammeprimitives" title="organigrammeprimitives" width="652" height="379" class="aligncenter size-full wp-image-1464" /></center></p>
<h4>Les classes de bases : </h4>
<ul>
<li><strong>GraphicElement</strong> : la base des primitives. Cette classe définit les tailles et positionnement de l’objet dans l’espace, avec ses contraintes de position. Les getters protégés drawX et drawY, utilisés par toutes les primitives, renvoient la position réelle en x et y de l’objet.</li>
<li><strong>StrokedElement</strong> : définit le Stroke (interface mx.graphics.IStroke), l’apparence de la ligne, de la primitive. La base des méthodes de dessin est présente : beginDraw, draw, endDraw. La méthode beginDraw applique le style du Stroke dans l’élément graphique Graphics de la primitive.</li>
<li><strong>FilledElement</strong> : définit le Fill (interface mx.graphics.IFill), l’apparence du fond, de la primitives. La méthode beginDraw prépare l’objet graphique en appliquant la ligne Stroke et le fond Fill. A ce niveau, la méthode draw n’effectue aucun tracé.</li>
</ul>
<p>Les primitives :</p>
<ul>
<li><strong>Line</strong> : (extension de StrokedElement) dessine une ligne, passant par 2 points (xFrom/yFrom et xTo/yTo). Si votre ligne est encadrée dans des contraintes top, bottom, left, right; la ligne dessinée sera une diagonale, respectant les contraintes top/left et bottom/right;</li>
<li><strong>Ellipse</strong> : (extension de FilledElement) dessine une ellipse définie par ses contraintes de positionnement;</li>
<li><strong>Rect</strong> : (extension de FilledElement) dessine un rectangle défini par ses contraintes de positionnement. Sa particularité est de pouvoir définir des rayons de courbure globaux (radiusX/radiusY), ou localisés aux angles du rectangle (topLeftRadiusX/topLeftRadiusY, bottomLeftRadiusX/bottomLeftRadiusY, &#8230;).</li>
<li><strong>Path</strong> : (extension de FilledElement) dessine une forme complexe, définie dans une propriété data. Cette source utilise la syntaxe SVG.</li>
</ul>
<h2>Digression : Définition et obtention d’un “data Path”</h2>
<p>Le “data source” d’une primitive Path est définit par un code, identique à celui utilisé dans le format vectoriel SVG. Ce code ressemble a celui-ci :<br />
 <strong>M 8 4 C 8 4 15 4 15 4 L 15 0 L 27 8 L 15 15 L 15 11 L 8 11 L 8 11 L 8 11 L 0 11 C 0 11 0 11 0 11 C 0 7 3 4 8 4 Z </strong></p>
<p>Il représente une flèche avec un bord arrondi, d’une largeur de 27 pixels, et une hauteur de 15 pixels. </p>
<h3>Fonctionnement du code</h3>
<p>c’est une succession de commandes (définies par des lettres), et de positions de points (les chiffres) en pixels utilisées par la commande.</p>
<p>Les différentes commandes sont :</p>
<ul>
<li><strong>M</strong> : <em>Move</em>, déplacement de la ligne vers le point définit par le couple de chiffres suivant. Exemple : “M 8 4” déplace le point courant de la ligne à la position x=8 et y=4. C’est toujours la première commande du code.</li>
<li><strong>L</strong> : <em>Line</em>, création d’une ligne, avec comme point de destination le couple de chiffres suivant. Exemple “ L 15 11” crée la ligne depuis le point précédent, vers le point x=15 et y 11.</li>
<li><strong>H</strong> : <em>Horizontal Line</em>, identique à la commande L, à la différence que seul le point de destination x est nécessaire. Exemple : “H 15” construit une ligne horizontale depuis le point précédent, vers le point x=15.</li>
<li><strong>V</strong> : <em>Vertical Line</em>, identique à la commande H, en vertical.</li>
<li><strong>Q</strong> : <em>Quadratic Bezier</em>, création d’une ligne courbe, a partir du précédent point, à destination du point définit par le dernier couple x/y, et passant par le point de contrôle définit par le premier couple x/y. exemple : “Q 15 11 20 22” la ligne est créée entre le point précédent et le point x=20, y=22, en passant par le point de contrôle x=15, y=11;</li>
<li><strong>C</strong> : <em>Cubic Bezier</em>, identique à la commande Q, à la différence que la ligne passe par un point de contrôle supplémentaire. Exemple : “ C 0 7 3 4 8 4” la ligne est créée entre le point précédent et le point x=8 / y=4, en passant par un premier point de contrôle x=0, y=7, et un second x=3, y=4;</li>
<li><strong>Z</strong> : <em>Close</em>, définit la fermeture de la forme. C’est aussi le dernier code du data.</li>
</ul>
<h3>Obtenir un code à partir d’une forme</h3>
<p>La meilleur méthode pour obtenir le code de votre forme vectorielle est de passer par Fireworks. Je vous recommande fortement d’utiliser ce logiciel pour vos créations d’interface, car très complet, performant, et beaucoup plus adapté à la création graphique web que Photoshop ou Illustrator. </p>
<p>Fireworks, depuis la CS4, dispose d’une commande d’exportation FXG. Vous pouvez la trouver sous “<strong>Commandes</strong>” > “<strong>Exporter au format FXG</strong>”.</p>
<p>Il vous suffit de sélectionner votre forme, (si rien n’est sélectionné, c’est la totalité du document, y compris les calques masqué, qui sera exporté), et de lancer la commande d’exportation.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/flechefireworks.png" alt="flechefireworks" title="flechefireworks" width="520" height="269" class="aligncenter size-full wp-image-1461" /></center><br />
Vous obtenez un document de ce type : </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Graphic version=&quot;1.0&quot;
    xmlns=&quot;http://ns.adobe.com/fxg/2008&quot;
    xmlns:d=&quot;http://ns.adobe.com/fxg/2008/dt&quot;
    xmlns:fc=&quot;http://ns.adobe.com/flashcatalyst/2009&quot;
    viewHeight= &quot;40&quot; viewWidth= &quot;150&quot;&gt;
    &lt;Library&gt;

        &lt;Definition name=&quot;Selection&quot;&gt;
            &lt;Group d:userLabel=&quot;Symbol&quot;&gt;
                &lt;Group d:userLabel=&quot;Group_0&quot;&gt;
                    &lt;Path winding=&quot;evenOdd&quot;
                    data=&quot;M 8 4 C 8 4 15 4 15 4 L 15 0 L 27 8 L 15 15 L 15 11 L 8 11 L 8 11 L 8 11 L 0 11 C 0 11 0 11 0 11 C 0 7 3 4 8 4 Z &quot;
                    blendMode=&quot;normal&quot; alpha=&quot;1&quot;&gt;
                        &lt;fill&gt;
                            &lt;SolidColor color=&quot;#b8b3af&quot;/&gt;
                        &lt;/fill&gt;
                    &lt;/Path&gt;
                &lt;/Group&gt;
            &lt;/Group&gt;
        &lt;/Definition&gt;
    &lt;/Library&gt;
    &lt;Selection x=&quot;0&quot; y=&quot;0&quot; /&gt;
&lt;/Graphic&gt;
</pre>
<p>Copiez le data du noeud &lt;Path /&gt;, et utilisez le dans votre skin comme dans cette exemple : </p>
<pre class="brush: xml">
&lt;s:Path
    top=&quot;0&quot; left=&quot;0&quot;
    data=&quot;M 8 4 C 8 4 15 4 15 4 L 15 0 L 27 8 L 15 15 L 15 11 L 8 11 L 8 11 L 8 11 L 0 11 C 0 11 0 11 0 11 C 0 7 3 4 8 4 Z &quot;&gt;

    &lt;s:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color.selected=&quot;#FCD301&quot; color=&quot;#F7F7F7&quot; ratio=&quot;0&quot; /&gt;
            &lt;s:GradientEntry color.selected=&quot;#F19000&quot; color=&quot;#C2C6C7&quot; ratio=&quot;1&quot; /&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/s:fill&gt;
    &lt;s:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot;
            distance=&quot;1&quot;
            blurX=&quot;4&quot; blurY=&quot;4&quot; quality=&quot;3&quot;
            alpha=&quot;0.8&quot; /&gt;
    &lt;/s:filters&gt;

&lt;/s:Path&gt;
</pre>
<h3>Et maintenant?</h3>
<p>L’idée serait de pouvoir créer des primitives, spécialisées ou non, utilisables dans un contexte de composants très précis, comme la primitive EazeElement du dernier article; ou dans une perspective plus globale, type librairie&#8230; Allons-y <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Un trou dans mon Rectangle</h2>
<p>Il peut être intéressant dans certains cas d’avoir un “trou” dans un rectangle. Pour créer par exemple une bordure qui pourrait avoir un Stroke ET un Fill. C’est ce que j’ai fais ici.</p>
<p>Pour obtenir un rectangle “troué” avec l’api de dessin, c’est extrêmement simple : il suffit de dessiner 2 rectangles l’un dans l’autre, à la suite : les points de vecteurs faisant partie du même chemin, cela génère l’exclusion du rectangle 2 dans le rectangle 1.<br />
<center></p>
<table>
<tr>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/forme1-150x150.png" alt="forme1" title="forme1" width="150" height="150" class="aligncenter size-thumbnail wp-image-1462" /></td>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/forme2-150x150.png" alt="forme2" title="forme2" width="150" height="150" class="aligncenter size-thumbnail wp-image-1463" /></td>
</tr>
</table>
<p></center><br />
Bon c’est une méthode rapide, mais qui est suffisante pour nos besoin&#8230; Nous ne sommes pas en train de coder un outil de Pathfinding !</p>
<h3>Dessin de rectangle</h3>
<p>Au lieu d’utiliser les méthodes de dessin de rectangle fournies par Flex, j’utilise celle proposée par <a href="http://twitter.com/elsassph">Philippe Elsass</a>. Performante, elle m’évite de recourir au méthode de base, qui lance des contrôles de positions évitable.<br />
Pour plus d’information sur son fonctionnement, je vous invite à vous rendre <a href="http://philippe.elsass.me/2009/05/as3-rounding-corners/">sur cette explication</a>.</p>
<p>La méthode utlisée dans la librairie, que j&#8217;expose ci-après, <a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/utils/UigfxUtils.as.html">derrière ce lien</a>.</p>
<h3>La primitive ExclusionRect</h3>
<p>Donc nous avons besoin de 2 rectangles. Le premier est celui qui correspond aux contraintes de positionnement de base de la primitive. J’utilise une petite méthode getOutterVectorPoint qui me renvoie le vecteur définissant les points de ce rectangle. Le second rectangle, celui définissant la zone à exclure, à lui besoin de contraintes spécifiques, que j’ai ajouté dans la classe (innerTop, innerRight, innerLeft, innerBottom). la méthode getInnerVectorPoint remplit la même fonction que getOutterVectorPoint. Dans l’override de la méthode draw, celle qui “dessine”, les 2 rectangles sont créés l’un après l‘autre. Cela donne : </p>
<pre class="brush: js">
/**
 * Return the Vector of Point for the rectangle
 */
protected function getOutterVectorPoint() : Vector.&lt;Point&gt;
{
    var vector : Vector.&lt;Point&gt; = new Vector.&lt;Point&gt;();
    vector.push( new Point( drawX, drawY ) );
    vector.push( new Point( drawX+width, drawY ) );
    vector.push( new Point( drawX+width, drawY+height ) );
    vector.push( new Point( drawX, drawY+height ) );
    return vector;
}
/**
 * Return the Vector of Point for the inner rectangle
 */
protected function getInnerVectorPoint() : Vector.&lt;Point&gt;
{
    var vector : Vector.&lt;Point&gt; = new Vector.&lt;Point&gt;();
    vector.push( new Point( drawX+innerLeft, drawY+innerTop ) );
    vector.push( new Point( drawX+width-innerRight, drawY+innerTop ) );
    vector.push( new Point( drawX+width-innerRight, drawY+height-innerBottom) );
    vector.push( new Point( drawX+innerLeft, drawY+height-innerBottom ) );
    return vector;
}

/**
 * Draw the rectangle
 * @see com.lafabrick.uigfx.utils.UigfxUtils
 */
override protected function draw(g:Graphics) : void
{
    UigfxUtils.drawRoundPath( g, getOutterVectorPoint(), radius, true );

    if( enableExclusion ) {
        UigfxUtils.drawRoundPath( g, getInnerVectorPoint(), innerRadius, true );
    }
}
</pre>
<h3>Utilisation</h3>
<p>L’utilisation est très proche de celle de Rect, avec les contraintes et radius intérieur : </p>
<pre class="brush: xml">
&lt;primitives:ExclusionRect id=&quot;excl&quot;
    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;primitives:fill&gt;
        &lt;s:SolidColor color=&quot;#353535&quot; /&gt;

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

&lt;/primitives:ExclusionRect&gt;
</pre>
<p><a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/primitives/ExclusionRect.as.html">La classe complète de la primitive</a></p>
<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/excludedrect.png" alt="excludedrect" title="excludedrect" width="239" height="238" class="aligncenter size-full wp-image-1458" /></center></p>
<h2>Dessine moi une forme !</h2>
<p>Une primitive qui me manque est celle permettant de dessiner une forme, à la manière de Path, mais en définissant un tableau de points. Quelque chose qui ressemble à ça : </p>
<pre class="brush: xml">
&lt;primitives:PointsPath
    radius=&quot;60&quot; width=&quot;100%&quot; height=&quot;100%&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;

    &lt;primitives:points&gt;
        &lt;mx:Point x=&quot;100&quot; y=&quot;0&quot; /&gt;
        &lt;mx:Point x=&quot;125&quot; y=&quot;75&quot; /&gt;
        &lt;mx:Point x=&quot;200&quot; y=&quot;75&quot; /&gt;
        &lt;mx:Point x=&quot;140&quot; y=&quot;125&quot; /&gt;
        &lt;mx:Point x=&quot;160&quot; y=&quot;200&quot; /&gt;
        &lt;mx:Point x=&quot;100&quot; y=&quot;155&quot; /&gt;
        &lt;mx:Point x=&quot;40&quot; y=&quot;200&quot; /&gt;
        &lt;mx:Point x=&quot;60&quot; y=&quot;125&quot; /&gt;
        &lt;mx:Point x=&quot;0&quot; y=&quot;75&quot; /&gt;
        &lt;mx:Point x=&quot;75&quot; y=&quot;75&quot; /&gt;
    &lt;/primitives:points&gt;

    &lt;primitives:fill&gt;
        &lt;s:SolidColor color=&quot;#222222&quot; /&gt;
    &lt;/primitives:fill&gt;

    &lt;primitives: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;/primitives:filters&gt;

&lt;/primitives:PointsPath&gt;
</pre>
<p>Bien, mais pas suffisant.<br />
Dans ce premier essai, les points sont définis “statiquement”. Une utilisation parfaite pour moi d’une telle primitive serait de pouvoir définir des contraintes de placement sur les points (top, verticalCenter, bottom et left, horizontalCenter, right), par rapport à la primitive.</p>
<p>J’ai donc fait une classe ConstraintPoint.</p>
<h3>ConstraintPoint : un point “contraint”</h3>
<p>Cette classe toute simple, extension de Point, dispose de propriétés de placement, en getter/setter : top, left, bottom, right, horizontalCenter, verticalCenter. Une méthode getConstraintPoint() renvoie un point x/y, calculer par rapport à une cible GraphicElement, en tenant compte des contraintes de placement. J’ai préféré avoir ce type de fonctionnement, plutôt que d’avoir le couple x/y directement modifié lors du set des différentes propriétés de contraintes. </p>
<p>Une primitive se dessine par rapport à son positionnement global. GraphicElement fournit les propriétés protégés drawX et drawY, qui donne les positions x/y de la primitive de manière global, par rapport à l’application. </p>
<p>La méthode getConstraintPoint() doit donc renvoyer le point par rapport à l’application. GraphicElement fournit tout la mécanique de calcul nécessaire, notamment l’objet postLayoutTransformOffsets, qui contient la position globale de la primitive.</p>
<p>La méthode en question :</p>
<pre class="brush: js">
public function getConstraintPoint( graphicElement : GraphicElement ) : Point
{
    var px : Number = 0;
    var py : Number = 0;

    var xOffset : Number;
    var yOffset : Number;

    if (graphicElement.displayObjectSharingMode ==
                        DisplayObjectSharingMode.OWNS_UNSHARED_OBJECT) {
        xOffset = 0;
        yOffset = 0;
    }
    else {
        xOffset = graphicElement.postLayoutTransformOffsets ?
                        graphicElement.x + graphicElement.postLayoutTransformOffsets.x : graphicElement.x;
        yOffset = graphicElement.postLayoutTransformOffsets ?
                        graphicElement.y + graphicElement.postLayoutTransformOffsets.y : graphicElement.y;
    }

    // Calcutates y position
    if( !isNaN( top ) ) {
        py = yOffset + top;
    }
    else if( !isNaN( bottom ) ) {
        py = yOffset + graphicElement.height - bottom;
    }
    else if( !isNaN( verticalCenter ) ) {
        py = ( yOffset + graphicElement.height ) / 2 + verticalCenter;
    }
    else {
        py = yOffset + y;
    }

    // Calcutates x position
    if( !isNaN( left ) ) {
        px = xOffset + left;
    }
    else if( !isNaN( right ) ) {
        px = xOffset + graphicElement.width - right;
    }
    else if( !isNaN( horizontalCenter ) ) {
        px = ( xOffset + graphicElement.width ) / 2 + horizontalCenter;
    }
    else {
        px = xOffset + x;
    }

    return new Point( px, py );
}
</pre>
<p>La classe complète ce trouve <a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/geom/ConstraintPoint.as.html">derrière ce lien.</a></p>
<p>Intéressons nous maintenant à la primitive.</p>
<h3>Primitive PointsPath</h3>
<p>J’utilise toujours la méthode de dessin drawRoundPath, contenu dans ma classe static UigfxUtils.</p>
<p>Ici, la classe étend FilledElement. Une propriété points, définit les différents points de type ConstraintPoint de la primitive. J’utilise ici un vecteur comme conteneur des points : Vector.&lt;ConstraintPoint&gt;. Le “set” de cette propriété appelle invalidateDisplayList(), afin de lancer le processus de dessin de la forme.</p>
<p>La méthode draw parcour le vecteur de points ConstraintPoint, appelle pour chacun sa méthode getConstraintPoint, et pousse le point dans un vecteur. C’est ce vecteur qui est utilisé par drawRoundPath.</p>
<p>Le code de cette mécanique : </p>
<pre class="brush: js">
public function get points():Vector.&lt;ConstraintPoint&gt;
{
    return _points;
}

/**
 * @private
 */
public function set points(value:Vector.&lt;ConstraintPoint&gt;):void
{
    _points = value;
    invalidateDisplayList();
}

/**
 * Draw the path
 * &lt;p&gt;Drawing method is static, in UiGfxUtils&lt;/p&gt;
 * @see com.lafabrick.uigfx.utils.UiGfxUtils
 */
override protected function draw(g:Graphics) : void
{
    // replace points from local to global position
    var vectorPoint : Vector.&lt;Point&gt; = new Vector.&lt;Point&gt;();
    for each( var point : ConstraintPoint in points ) {
        vectorPoint.push( point.getConstraintPoint( this ) );
    }
    // launch drawing method
    UigfxUtils.drawRoundPath( g, vectorPoint, radius, true );
}
</pre>
<p><a href="http://www.lafabrick.com/projects/uigfx-lib/sample/srcview/source/uigfx/src/com/lafabrick/uigfx/primitives/PointsPath.as.html">La classe PointsPath en entier</a></p>
<h3>Utilisation</h3>
<p>Reprenons l’exemple, avec cette primitive et les contraintes de placement : </p>
<pre class="brush: xml">
&lt;primitives:PointsPath
    radius=&quot;60&quot; width=&quot;100%&quot; height=&quot;100%&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;

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

    &lt;primitives:fill&gt;
        &lt;s:SolidColor color=&quot;#222222&quot; /&gt;
    &lt;/primitives:fill&gt;

    &lt;primitives: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;/primitives:filters&gt;

&lt;/primitives:PointsPath&gt;
</pre>
<p><center> </p>
<table>
<tr>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/starstd-150x150.png" alt="starstd" title="starstd" width="150" height="150" class="aligncenter size-thumbnail wp-image-1459" /></td>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/12/startextended-150x150.png" alt="startextended" title="startextended" width="150" height="150" class="aligncenter size-thumbnail wp-image-1460" /></td>
</tr>
</table>
<p></center></p>
<p>La forme respecte les contraintes de placement, en fonction de l’évolution de la taille de la primitive. Amazing ! <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
L&#8217;exemple complet (les sources au clic droit), <a href="http://www.lafabrick.com/projects/uigfx-lib/sample/">ce cache sous ce lien</a>.</p>
<h2>Librairie Uigfx</h2>
<p>Tout ce que je viens d’exposer fait partie d’une librairie nommée par <a href="http://twitter.com/rick_lafabrick">Erick</a> &laquo;&nbsp;uigfx&nbsp;&raquo;.<br />
Cette petite librairie, sera bientôt disponible publiquement sur le svn lafabrick. Vous pouvez d’ores et déjà <a href="http://www.lafabrick.com/projects/uigfx-lib/project/uigfx.fxpl">télécharger le projet</a> (format .fxpl), dans la version proposée dans cette article. La documentation ( en anglais&#8230; pas parfait ! ) <a href="http://www.lafabrick.com/projects/uigfx-lib/apidoc/">est disponible là</a>.</p>
<p>[UPDATE]<br />
Le projet uigfx a maintenant sa page sur <a href="http://code.google.com/p/uigfx/">google code</a>. Pour plus d&#8217;information, <a href="http://www.lafabrick.com/blog/2010/02/09/1559-uigfx-project-flex4-primitives-fireworks-extension/">la présentation de ce projet</a>.<br />
[/UPDATE]</p>
<p>Je vous laisse la place sur le fil de commentaire !</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/11/16/19-petit-cour-sur-lapi-de-dessin/" rel="bookmark" title="16 novembre 2006">Petit cours sur l’API de dessin</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/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>
</ul>
<p><!-- Similar Posts took 15.193 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flex4 : composant personnalisé et skinning</title>
		<link>http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/</link>
		<comments>http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 16:49:45 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[skinning]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1373</guid>
		<description><![CDATA[Je vous propose un petit tour d’horizon de la création de compo personnalisés avec Flex4 et le skinning. Vous allez voir ! Comme moi, vous ne voudrez plus jamais faire de Flex3. Moi ça fait 5 mois&#8230; et j’en suis bien content ! Alors voila. Nous allons voir comment faire un composant personnalisé avec le [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2009/11/backcompo.jpg" alt="backcompo" title="backcompo" width="520" height="132" class="aligncenter size-full wp-image-1419" /></center><br />
Je vous propose un petit tour d’horizon de la création de compo personnalisés avec Flex4 et le skinning. Vous allez voir ! Comme moi, vous ne voudrez plus jamais faire de Flex3. Moi ça fait 5 mois&#8230; et j’en suis bien content !<br />
<span id="more-1373"></span><br />
Alors voila. Nous allons voir comment faire un composant personnalisé avec le SDK4, de la conception actionScript, au skinning.<br />
Il me fallait une idée de départ&#8230; Ceux qui me suivent sur <a href="http://twitter.com/fabienbizot">Twitter</a> aurons vu/lu qu’en ce moment je m’éclate avec <a href="http://philippe.elsass.me/2009/11/as3-eaze-tween-library-update/">Eaze</a>, la librairie d’animation de <a href="http://twitter.com/elsassph">Philippe Elsass</a>. Super légère, facile d’utilisation et performante (<a href="http://twitter.com/nicoptere">Nicoptère</a> a réalisé <a href="http://en.nicoptere.net/?p=632">quelques “petites” démos</a> sur le sujet). Je ne saurais que trop vous la conseiller.<br />
Et bien on va se faire un petit compo de visualisation de ces fonctions d’animations <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Première étapes : la primitive étendue</h2>
<p>Avant de partir sur le composant, nous allons d’abord faire une extension de <a href="http://help.adobe.com/en_US/Flex/4.0/langref/spark/primitives/supportClasses/StrokedElement.html">StrokedElement</a>, qui va se charger de dessiner les courbes d’animations.</p>
<p>La classe StrokedElement est, dans Flex4, la classe de base pour tous les éléments graphiques ayant à dessiner une ligne. FilledElement, extensions de StrokedElement, s’occupe du remplissage. Les classes Line, Rect, Ellipse, Path&#8230; sont elles mêmes des extensions de FilledElement.</p>
<p>Nous allons donc créer une classe EazeElement, qui étend StrokedElement.<br />
L’idée ici n’est pas d’afficher la “vraie” courbe d’accélération, mais plutôt d’avoir une “information visuelle” qui nous donne une idée sur l’évolution de l’animation, avec un point de départ et d’arrivé identique&#8230; Le voir en vrai c’est plus simple qu’à expliquer&#8230;</p>
<p>Nous allons associer à cette primitive 2 propriétés : <strong>eazeFunction</strong> : la fonction d’animation a tracer, et <strong>step</strong> la “précision” de la ligne.</p>
<p>Ensuite, il suffit d’overrider la méthode <strong>draw</strong>, et de faire ce que l’on veut dedans.<br />
En gros nous allons boucler sur la largeur de l’élément, en se décalant à chaque passe de la valeur step, et calculer la position x, y de notre ligne en fonction de eazeFunction&#8230;. <a href="http://www.lafabrick.com/labz/eazeViewer/srcview/source/com/lafabrick/primitives/EazeElement.as.html">Vous pouvez voir en vrai la classe sous ce lien</a>.</p>
<p>Aller hop on test tout ça ! Pour l’apparence, nous ajoutons à notre élément un “IStroke”. Cela peut être, &lt;s:SolidColorStroke /&gt;, &lt;s:LinearGradientStroke /&gt;, &#8230; Y’en à d’autres : à vous de tester !</p>
<pre class="brush: xml">
&lt;primitives:EazeElement
    eazeFunction=&quot;Elastic.easeInOut&quot; step=&quot;2&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot; width=&quot;400&quot; height=&quot;200&quot;&gt;

    &lt;primitives:stroke&gt;

        &lt;s:LinearGradientStroke rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color=&quot;#F19000&quot; /&gt;
            &lt;s:GradientEntry color=&quot;#00FF00&quot; /&gt;
            &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
        &lt;/s:LinearGradientStroke&gt;

    &lt;/primitives:stroke&gt;

&lt;/primitives:EazeElement&gt;
</pre>
<p><center><img class="aligncenter size-full wp-image-1385" title="eaze element" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/11/imageeazeelt.jpg" alt="eaze element" width="400" height="132" /><br />
Rhooo ! C&#8217;est jouli !</center></p>
<h2>C’est parti pour le composant</h2>
<p>Notre composant va étendre SkinnableContainer, base pour la création de composant.</p>
<pre class="brush: js">
package com.lafabrick.components
{
    public class SimpleEazeViewer extends SkinnableContainer
    ...
</pre>
<p>Nous voulons utiliser notre primitive EazeElement dans ce compo. Il pourra aussi être redimensionnable, via une “ancre”. Nous devons donc définir ces différents objets de contrôles, dans la définition de notre composant. Nous utilisons ici les SkinPart.</p>
<h3>SkinPart</h3>
<p>Une skinPart définit un objet, visuel ou non, devant être présent (de manière obligatoire ou non) dans la skin. Ajoutons nos parties :</p>
<pre class="brush: js">
public class SimpleEazeViewer extends SkinnableContainer
{
    [SkinPart(required=&quot;false&quot;)]
    public var anchor : Group;

    [SkinPart(required=&quot;true&quot;)]
    public var eazeElement : EazeElement;
</pre>
<p>ici, eazeElement est requis et obligatoire. anchor, l’ancre pour redimensionner le composant, par contre est optionnel.</p>
<p>Nous verrons plus bas comment les utiliser dans le composant. Occupons nous des états de ce composant.</p>
<h3>SkinState</h3>
<p>SkinnableContainer définit 2 états de base : “normal” et “disabled”. Ces états devront être présents dans la skin. Nous allons ajouter un état “selected” : lorsque l’utilisateur déplacera l’ancre, le composant passera en état “selected”. Pour ajouter un état personnalisé, dans l’en-tête de classe, ajoutons le tag suivant :</p>
<pre class="brush: js">
[SkinState(name=&quot;selected&quot;)]
</pre>
<p>Nous allons également créer une propriété selected, qui définira si le composant est sélectionné&#8230;</p>
<p>dans le setter, nous allons appeler la fonction invalidateSkinState(), qui va déclencher le processus de changement d’état. Pour relier la propriété selected à l’état sélectionner, nous devons overrider la fonction protégée getCurrentSkinState().</p>
<pre class="brush: js">
private var _selected : Boolean = false;

public function get selected():Boolean
{
    return _selected;
}

public function set selected(value:Boolean):void
{
    _selected = value;
    invalidateSkinState();
}

override protected function getCurrentSkinState() : String
{
    return selected ? &quot;selected&quot; : &quot;normal&quot;;
}
</pre>
<p>Ajoutons enfin la dernière propriété eazeFonction : Function qui va nous permettre de définir la fonction à tracer par la primitive.</p>
<h3>Overridons un brin</h3>
<p>Il est temps de passer à la gestion de tout ça. Ce que l’on a besoin, c’est de savoir quand les différents éléments définit dans les SkinPart sont ajoutés, pour leur pousser les propriétés et autres écouteurs qui vont bien. Pour cela, nous devons overrider la méthode partAdded de la manière suivante.</p>
<pre class="brush: js">
override protected function partAdded(partName:String, instance:Object) : void
{
    super.partAdded( partName, instance );

    if( instance == eazeElement ) {
        eazeElement.eazeFunction = eazeFunction;
    }

    if( instance == anchor ) {
        anchor.addEventListener(MouseEvent.MOUSE_DOWN, onAnchorMouseDown );
        systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_UP, onMouseUp );
        systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove );
    }
}
</pre>
<p>Dans le sens inverse, il faut overrider partRemoved pour, entre autre chose, enlever les écouteurs sur les éléments.</p>
<pre class="brush: js">
override protected function partRemoved(partName:String, instance:Object) : void
{
    super.partRemoved( partName, instance );

    if( instance == anchor ) {
        anchor.removeEventListener(MouseEvent.MOUSE_DOWN, onAnchorMouseDown );
        systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_UP, onMouseUp );
        systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove );
    }
}
</pre>
<p>Plus qu’à mettre la mécanique dans les fonctions qui vont bien.</p>
<p><a href="http://www.lafabrick.com/labz/eazeViewer/srcview/source/com/lafabrick/components/SimpleEazeViewer.as.html">La classe complète ici</a></p>
<p>plutôt super simple ce fonctionnement !</p>
<h2>Côté skin</h2>
<h3>Skin ou SparkSkin ?</h3>
<p>Vous avez 2 possibilités : partir de Skin ou SparkSkin, la dernière étant une extension de la première. La différence est que SparkSkin ajoute une mécanique spéciale pour exclure des éléments de la mécanique de skinning. Dans Flex4 vous pouvez injecter des couleurs de base à vos skin, avec la propriété baseColor. L’exclusion permet d’éviter de coloriser les éléments sélectionnés. Je vous invite a faire un saut dans les classes Skin des boutons (ex: spark.skins.spark.ToggleButtonSkin ) pour voir à quoi cela ressemble.</p>
<p>Nous allons choisir Skin.</p>
<h3>Pointer sur le composant cible</h3>
<p>En premier lieu, nous devons spécifier quel est le composant cible de cette skin. Cela se passe dans le tag metadata :</p>
<pre class="brush: xml">
&lt;fx:Metadata&gt;
    [HostComponent(&quot;com.lafabrick.components.SimpleEazeViewer&quot;)]
&lt;/fx:Metadata&gt;
</pre>
<h3>Les états</h3>
<p>Nous devons aussi retrouver les états définit dans le composants : normal, disabled et selected :</p>
<pre class="brush: xml">
&lt;s:states&gt;
    &lt;s:State name=&quot;normal&quot; /&gt;
    &lt;s:State name=&quot;selected&quot; /&gt;
    &lt;s:State name=&quot;disabled&quot; /&gt;
&lt;/s:states&gt;
</pre>
<p>Plus qu’a ajouter vos éléments définit dans les skinPart (un Group avec l’id “anchor” et un EazeElement avec l’id “eazeElement” ). Et puis vous amusez a faire de la déco à grand coup de Rect, Ellipse, Line, Path, &#8230;. La grande classe !<br />
Tout ces éléments se calibrent avec les contraintes top, left, bottom, right. Les possibilités sont infinies.</p>
<pre class="brush: xml">
&lt;s:Group id=&quot;anchor&quot; top=&quot;0&quot; bottom=&quot;0&quot; width=&quot;16&quot; right=&quot;0&quot;&gt;
    &lt;s:Rect
        topRightRadiusX=&quot;8&quot; topRightRadiusY=&quot;8&quot;
        bottomRightRadiusX=&quot;8&quot; bottomRightRadiusY=&quot;8&quot;
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;&gt;
        &lt;s:fill&gt;
            &lt;s:SolidColor color=&quot;#212121&quot; alpha=&quot;0&quot; /&gt;
        &lt;/s:fill&gt;
    &lt;/s:Rect&gt;

    &lt;s:Group verticalCenter=&quot;0&quot; height=&quot;16&quot; horizontalCenter=&quot;0&quot;&gt;
        &lt;s:Line top=&quot;0&quot; bottom=&quot;0&quot; horizontalCenter=&quot;-2&quot;&gt;
            &lt;s:stroke&gt;
                &lt;s:SolidColorStroke color=&quot;#353535&quot; /&gt;
            &lt;/s:stroke&gt;
        &lt;/s:Line&gt;
        &lt;s:Line top=&quot;0&quot; bottom=&quot;0&quot; horizontalCenter=&quot;0&quot;&gt;
            &lt;s:stroke&gt;
                &lt;s:SolidColorStroke color=&quot;#353535&quot; /&gt;
            &lt;/s:stroke&gt;
        &lt;/s:Line&gt;
        &lt;s:Line top=&quot;0&quot; bottom=&quot;0&quot; horizontalCenter=&quot;2&quot;&gt;
            &lt;s:stroke&gt;
                &lt;s:SolidColorStroke color=&quot;#353535&quot; /&gt;
            &lt;/s:stroke&gt;
        &lt;/s:Line&gt;
    &lt;/s:Group&gt;	

&lt;/s:Group&gt;
</pre>
<h3>Pimp my State! inclusion, exclusion, groupage&#8230;.</h3>
<p>Voyons comment gérer notre skin en fonction de ses états.<br />
Le nouveau système de gestion d&#8217;états est bien loin de celui proposé dans Flex3. Plus simple et bien plus logique, il vous permet un contrôle total de votre skin.<br />
Admettons que vous ayez un composant avec les états suivants :</p>
<pre class="brush: xml">
&lt;s:states&gt;

    &lt;s:State name=&quot;up&quot; /&gt;
    &lt;s:State name=&quot;down&quot; /&gt;
    &lt;s:State name=&quot;over&quot; /&gt;
    &lt;s:State name=&quot;upAndSelected&quot; /&gt;
    &lt;s:State name=&quot;downAndSelected&quot; /&gt;
    &lt;s:State name=&quot;overAndSelected&quot; /&gt;
    &lt;s:State name=&quot;disabled&quot; /&gt;

&lt;/s:states&gt;
</pre>
<p>Un rectangle est définit dans la skin,  et doit être inclus dans les états &laquo;&nbsp;up&nbsp;&raquo;, &laquo;&nbsp;down&nbsp;&raquo;, &laquo;&nbsp;over&nbsp;&raquo;. La déclaration de l&#8217;inclusion, et des différentes couleurs en fonction des états devra se faire suivant cette exemple : </p>
<pre class="brush: xml">
&lt;s:Rect includeIn=&quot;over, down, up&quot; top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;&gt;
    &lt;s:stroke&gt;
        &lt;s:SolidColorStroke color=&quot;#212121&quot; /&gt;
    &lt;/s:stroke&gt;

    &lt;s:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color.down=&quot;#FCD301&quot; color.over=&quot;#FCD301&quot; color=&quot;#F7F7F7&quot; ratio=&quot;0&quot; /&gt;
            &lt;s:GradientEntry color.down=&quot;#F19000&quot; color.over=&quot;#F19000&quot; color=&quot;#C2C6C7&quot; ratio=&quot;1&quot; /&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/s:fill&gt;

    &lt;s:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; distance=&quot;1&quot;
            blurX.over=&quot;10&quot; blurX.down=&quot;10&quot; blurX=&quot;4&quot;
            blurY.over=&quot;10&quot; blurY.down=&quot;10&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/s:filters&gt;
&lt;/s:Rect&gt;
</pre>
<p>Vous pouvez voir ici que l&#8217;attribution de valeur en fonction des états fonctionne aussi bien sur des couleurs que sur n&#8217;importe quelle autre propriété, comme sur le filtre.</p>
<p>Les états proposent une mécanique de groupage par nom, qui vous permet de pousser encore plus loin la gestion de la skin. Un état peut faire partie de plusieurs groupes : </p>
<pre class="brush: xml">
&lt;s:states&gt;

    &lt;s:State name=&quot;up&quot; /&gt;
    &lt;s:State name=&quot;down&quot; stateGroups=&quot;mouseOn&quot; /&gt;
    &lt;s:State name=&quot;over&quot; stateGroups=&quot;mouseOn&quot; /&gt;
    &lt;s:State name=&quot;upAndSelected&quot;  stateGroups=&quot;selected, mouseOn&quot; /&gt;
    &lt;s:State name=&quot;downAndSelected&quot;  stateGroups=&quot;selected, mouseOn&quot; /&gt;
    &lt;s:State name=&quot;overAndSelected&quot; stateGroups=&quot;selected, mouseOn&quot; /&gt;
    &lt;s:State name=&quot;disabled&quot; /&gt;

&lt;/s:states&gt;
</pre>
<p>Les états down et over, en vue &laquo;&nbsp;normal&nbsp;&raquo; et &laquo;&nbsp;sélectionné&nbsp;&raquo; font partie d&#8217;un même groupe &laquo;&nbsp;mouseOn&nbsp;&raquo;. De même, les états sélectionnés sont regroupés dans un groupe &laquo;&nbsp;selected&nbsp;&raquo;.</p>
<p>Nous pouvons alors modifier la skin de notre rectangle. Au lieu de définir dans quel état le rectangle est présent, nous allons plutôt lui définir dans quels groupes d&#8217;états il est exclu : </p>
<pre class="brush: xml">
&lt;s:Rect excludeFrom=&quot;selected&quot; top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;&gt;
</pre>
<p>De même, la définition des couleurs et des propriétés du filtre peut être affectée globalement en fonction du groupe d&#8217;état : </p>
<pre class="brush: xml">
&lt;s:Rect excludeFrom=&quot;selected&quot; top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;&gt;
    &lt;s:stroke&gt;
        &lt;s:SolidColorStroke color=&quot;#212121&quot; color.mouseOn=&quot;#F7F7F7&quot; weight.mouseOn=&quot;2&quot; /&gt;
    &lt;/s:stroke&gt;

    &lt;s:fill&gt;
        &lt;s:LinearGradient rotation=&quot;90&quot;&gt;
            &lt;s:GradientEntry color.mouseOn=&quot;#FCD301&quot; color=&quot;#F7F7F7&quot; ratio=&quot;0&quot; /&gt;
            &lt;s:GradientEntry color.mouseOn=&quot;#F19000&quot; color=&quot;#C2C6C7&quot; ratio=&quot;1&quot; /&gt;
        &lt;/s:LinearGradient&gt;
    &lt;/s:fill&gt;

    &lt;s:filters&gt;
        &lt;s:DropShadowFilter color=&quot;#000000&quot; distance=&quot;1&quot;
            blurX.mouseOn=&quot;10&quot; blurX=&quot;4&quot;
            blurY.mouseOn=&quot;10&quot; blurY=&quot;4&quot;
            quality=&quot;3&quot; alpha=&quot;0.8&quot; /&gt;
    &lt;/s:filters&gt;
&lt;/s:Rect&gt;
</pre>
<p>Le rectangle est exclu des états sélectionnés, et les couleurs sont attribuées en fonction du groupe définissant une interaction de l&#8217;utilisateur &laquo;&nbsp;mouseOn&nbsp;&raquo;.</p>
<p>Sympa non?</p>
<h3>Je veux mon composant !</h3>
<p>Vous pouvez bien sur accéder a votre composant via hostComponent : si par exemple vous définissez un texte dans votre composant, vous avez possibilité de l’affecter directement dans votre skin comme ceci :</p>
<pre class="brush: xml">
&lt;s:Label id=&quot;labelDisplay&quot;

    text=&quot;{hostComponent.monTitre}&quot;

    textAlign=&quot;center&quot;
    verticalAlign=&quot;middle&quot;
    maxDisplayedLines=&quot;1&quot;
    horizontalCenter=&quot;0&quot; verticalCenter=&quot;1&quot;
    left=&quot;10&quot; right=&quot;10&quot; top=&quot;2&quot; bottom=&quot;2&quot; /&gt;
</pre>
<h3>Bon a savoir : le contentGroup</h3>
<p>SkinnableContainer définit un Group optionnel, contentGroup, qui, comme son nom l’indique est le groupe du contenu <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Ce groupe est le réceptacle des différents éléments que vous pouvez ajouter a votre compo. Par exemple un Panel dispose de ce contentGroup. Sinon on met rien dedans et ce ne serait plus un Panel&#8230;. Bon nous n’en avons pas besoin ici, mais si jamais vous avez besoin d’un composant qui peut être aussi un réceptacle de composants, n’oublier pas le contentGroup !</p>
<h3>Retournons à notre compo&#8230;</h3>
<p>&#8230; et regardons<a href="http://www.lafabrick.com/labz/eazeViewer/srcview/source/com/lafabrick/skins/SimpleEazeViewerSkin.mxml.html"> la skin complète.</a></p>
<h2>Un peu plus loin&#8230;</h2>
<p>Imaginons maintenant que vous ne vouliez plus afficher une courbe mais plusieurs à la suite, définit dans un tableau. Vous n’aurez donc plus un eazeElement, mais un Group qui contiendra vos primitives.<br />
Le problème alors est de pouvoir skinner le trait de vos primitives. Vous devrez donc définir un IStroke. Ce qui est intéressant dans ce nouveau système de skin, c’est qu’il est aussi possible de définir ce Stroke, pourtant élément non visuel, dans une SkinPart.</p>
<pre class="brush: js">
[SkinPart(required=&quot;false&quot;)]
public var anchor : Group;

[SkinPart(required=&quot;true&quot;)]
public var eazeGroup : Group;

[SkinPart(required=&quot;true&quot;)]
public var eazeStroke : IStroke;
</pre>
<p>La déclaration côté Skin ce fera a l’intérieur des balises déclaration :</p>
<pre class="brush: xml">
&lt;fx:Metadata&gt;
    [HostComponent(&quot;com.lafabrick.components.MultipleEazeViewer&quot;)]
&lt;/fx:Metadata&gt;

&lt;fx:Declarations&gt;
    &lt;s:LinearGradientStroke id=&quot;eazeStroke&quot; rotation=&quot;90&quot;&gt;
        &lt;s:GradientEntry color=&quot;#F19000&quot; /&gt;
        &lt;s:GradientEntry color=&quot;#00FF00&quot; /&gt;
        &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
    &lt;/s:LinearGradientStroke&gt;
&lt;/fx:Declarations&gt;
</pre>
<p>La nouvelle classe, <a href="http://www.lafabrick.com/labz/eazeViewer/srcview/source/com/lafabrick/components/MultipleEazeViewer.as.html">se cache derrière ce lien</a>, et la skin associée <a href="http://www.lafabrick.com/labz/eazeViewer/srcview/source/com/lafabrick/skins/MultipleEazeViewerSkin.mxml.html">derrière celui-ci</a>.</p>
<p><center><a href="http://www.lafabrick.com/labz/eazeViewer/"><img class="aligncenter size-full wp-image-1384" title="compos final" src="http://www.lafabrick.com/blog/wp-content/uploads/2009/11/composfinal-1.jpg" alt="compos final" width="513" height="551" /></a></center></p>
<p><center><a href="http://www.lafabrick.com/labz/eazeViewer/">La démo finale</a> (<a href="http://www.lafabrick.com/labz/eazeViewer/srcview/index.html"> les sources</a> )</center><br />
J’espère que comme moi vous tomberez sous le charme. C’est fou comme une évolution peut vous montrer à quel point c’était tout nul avant !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/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/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 12.361 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Data visualization : BeeDocs 3D TimeLine Concept</title>
		<link>http://www.lafabrick.com/blog/2009/01/08/658-3d-timeline/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/08/658-3d-timeline/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 01:00:16 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[Pure Style]]></category>
		<category><![CDATA[DataVisualisation]]></category>
		<category><![CDATA[UI Design]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=658</guid>
		<description><![CDATA[Si les interfaces 3D permettent de très jolis effets graphiques ( whitevoid par exemple ) , j&#8217;ai vu peu d&#8217;exemples dans lesquels la 3D apportait une réelle amélioration en terme &#171;&#160;d&#8217;ergonomie&#160;&#187;. Dans la présentation qui suit, BeeDocs propose un intéressant concept de visualisation 3D de chronologies. On dirait que les rotations 3D de FP10 arrivent [...]]]></description>
			<content:encoded><![CDATA[<p>Si les interfaces 3D permettent de très jolis effets graphiques ( <a href="http://www.whitevoid.com/application.html" alt="AS3 3D Navigation Exemple" )> whitevoid</a> par exemple  ) , j&#8217;ai vu peu d&#8217;exemples dans lesquels la 3D apportait une réelle amélioration en terme &laquo;&nbsp;d&#8217;ergonomie&nbsp;&raquo;. Dans la présentation qui suit, BeeDocs propose un intéressant concept de visualisation 3D de chronologies.</p>
<p><img src="http://lafabrick.free.fr/blogImg/beedocs3dTimeline-20090108-020049.jpg" alt="BeeDocs 3D Timeline Concept" /></p>
<p><span id="more-658"></span></p>
<p><object width="583" height="470"><param name="movie" value="http://www.youtube.com/v/0aimgEBJB3Y&#038;hl=fr&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/0aimgEBJB3Y&#038;hl=fr&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="583" height="470"></embed></object></p>
<p>On dirait que les rotations 3D de FP10 arrivent à point&#8230; ;-p</p>
<p>Et vous ? vous z&#8217;en connaissez des exemples d&#8217;interfaces &laquo;&nbsp;utilement&nbsp;&raquo; en 3D  ???</p>
<p>Plus d&#8217;info sur <a href="http://www.beedocs.com">BeeDocs</a></p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/08/31/210-flex-active-desktop-le-webgadgetos-qui-fait-de-l-effet/" rel="bookmark" title="31 août 2007">Flex Active Desktop : le webGadgetOS qui fait de l&#8217;effet !</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/08/07/197-tileui-un-bureau-raliste-en-as3/" rel="bookmark" title="7 août 2007">TileUI : un bureau &laquo;&nbsp;réaliste&nbsp;&raquo; en AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/05/285-le-design-declaratif-un-nom-degrafa/" rel="bookmark" title="5 janvier 2008">Le design déclaratif à un nom : Degrafa</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/07/322-le-double-effet-java-fx/" rel="bookmark" title="7 mai 2008">JavaFX et Open Screen Project, ou la naissance des applications universelles&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 11.598 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/08/658-3d-timeline/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Design d&#8217;applications riches : les objectifs de Thermo ?</title>
		<link>http://www.lafabrick.com/blog/2008/04/30/319-design-d-applications-riches-les-objectifs-de-thermo/</link>
		<comments>http://www.lafabrick.com/blog/2008/04/30/319-design-d-applications-riches-les-objectifs-de-thermo/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 18:01:55 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flash catalyst]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=319</guid>
		<description><![CDATA[Durant les conférences MAX 2007 Adobe a présenté Thermo : l&#8217;outil qui va &#171;&#160;révolutionner&#160;&#187; le workflow &#171;&#160;designer / developper&#160;&#187; durant la création d&#8217;appli Flex. Les démos nous montraient la possibilité de créer des fichiers mxml en quelques clics à partir de fichiers graphiques ( photoshop, fireworks&#8230; ). Dans cette nouvelle vidéo, un des concepteurs de [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lafabrick.free.fr/blogImg/thermo_discussion-20080430-182256.png" alt="" /><br />
Durant les conférences MAX 2007 Adobe a présenté Thermo : l&#8217;outil qui va &laquo;&nbsp;révolutionner&nbsp;&raquo; le workflow &laquo;&nbsp;designer / developper&nbsp;&raquo; durant la création d&#8217;appli Flex. Les démos nous montraient la possibilité de créer des fichiers mxml en quelques clics à partir de fichiers graphiques ( photoshop, fireworks&#8230; ).</p>
<p>Dans cette nouvelle vidéo, un des concepteurs de l&#8217;application revient sur les avancées de Flex builder 3 en terme de personnalisation graphique, et nous explique pourquoi et comment Thermo viendra épauler Flex 4 pour la création de nos futures applications riches.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="305" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="id" value="showplayer" /><param name="quality" value="best" /><param name="src" value="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&amp;feedurl=http%3A%2F%2Fonairbustourlive%2Eblip%2Etv%2Frss&amp;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F718167&amp;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" /><embed id="showplayer" type="application/x-shockwave-flash" width="480" height="305" src="http://blip.tv/scripts/flash/showplayer.swf?enablejs=true&amp;feedurl=http%3A%2F%2Fonairbustourlive%2Eblip%2Etv%2Frss&amp;file=http%3A%2F%2Fblip%2Etv%2Frss%2Fflash%2F718167&amp;showplayerpath=http%3A%2F%2Fblip%2Etv%2Fscripts%2Fflash%2Fshowplayer%2Eswf" quality="best"></embed></object></p>
<p><a hreflang="en" href="http://labs.adobe.com/wiki/index.php/Thermo">Thermo@adobe Labs</a></p>
<p><a hreflang="en" href="http://www.adobe.com/newsletters/edge/december2007/video/index.html">Voir la présentation vidéo officielle de Thermo</a></p>
<p>via <a hreflang="en" href="http://www.rictus.com/muchado">http://www.rictus.com/muchado</a>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/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/2008/01/05/285-le-design-declaratif-un-nom-degrafa/" rel="bookmark" title="5 janvier 2008">Le design déclaratif à un nom : Degrafa</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>
</ul>
<p><!-- Similar Posts took 12.159 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2008/04/30/319-design-d-applications-riches-les-objectifs-de-thermo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le design déclaratif à un nom : Degrafa</title>
		<link>http://www.lafabrick.com/blog/2008/01/05/285-le-design-declaratif-un-nom-degrafa/</link>
		<comments>http://www.lafabrick.com/blog/2008/01/05/285-le-design-declaratif-un-nom-degrafa/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 21:18:53 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Degrafa]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=285</guid>
		<description><![CDATA[Ce 2 janvier est sortie un framework qui fera certainement parler de lui dans les mois à venir&#160;: j&#8217;ai nommé Degrafa. Cela fait un moment que je l&#8217;attendais celui-là&#8230; et en teasing ils en connaissent un rayon les p&#8217;tit gars de Degrafa&#160;! Baptisé Origin dans sa version Beta, Degrafa est un framework de design déclaratif [...]]]></description>
			<content:encoded><![CDATA[<p>Ce 2 janvier est sortie un framework qui fera certainement parler de lui dans les mois à venir&nbsp;: j&#8217;ai nommé Degrafa. Cela fait un moment que je l&#8217;attendais celui-là&#8230; et en teasing ils en connaissent un rayon les p&#8217;tit gars de Degrafa&nbsp;!</p>
<p>Baptisé Origin dans sa version Beta, Degrafa est un framework de design déclaratif pour Flex. En gros&nbsp;: 2/3 balises mxml et vous voilà avec un joli polygone ou autres géométries vectorielles. De quoi se réinventer un tableau blanc. <br />
Mais c&#8217;est aussi bien plus que ça&nbsp;: en plus de formes simples classiques, de formes libres, et autres outils de barbouillages; Degrafa nous fournis un certain nombre de classe nous permettant de skinner nos composants simplement. Une gestion étendue des fichiers SVG est prévu par la team&#8230; miam&nbsp;! Et certainement d&#8217;autre chose à découvrir.</p>
<p>Le Framework est disponible sur le <a href="http://code.google.com/p/degrafa/" hreflang="en">Google Code Degrafa</a>. Plus d&#8217;information sur <a href="http://www.degrafa.com/" hreflang="en">degrafa.com</a></p>
<p>A noter quelques bugs, notamment dans la gestion des skins CSS (class CSSSkin), que j&#8217;ai pu faire remonter sur le <a href="http://groups.google.com/group/degrafa/" hreflang="en">Google group</a> du projet. Une version prochaine devrait résoudre tout ça.</p>
<p>En attendant, et parce que c&#8217;est bien d&#8217;agir, vous pouvez voir <a href="http://lafabrick.com/lab/degrafa/mxml/" hreflang="fr">mon petit essai</a> (les sources au clic droit. Le composant lafabrick <a href="http://code.google.com/p/lafabrick/" hreflang="fr">dispo ici</a> <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</p>
<p><strong>UPDATE | Un autre exemple de <a href="http://lafabrick.com/lab/degrafa/as/" hreflang="fr">création de forme en AS3</a></strong> (sources incluses)</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/12/06/277-librairie/" rel="bookmark" title="6 décembre 2007">Librairie lafabrick : parce que je le vaut bien</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/05/18/57-pimp-my-flex-la-suite/" rel="bookmark" title="18 mai 2007">Pimp my Flex, la suite&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/04/30/319-design-d-applications-riches-les-objectifs-de-thermo/" rel="bookmark" title="30 avril 2008">Design d&#8217;applications riches : les objectifs de Thermo ?</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>
</ul>
<p><!-- Similar Posts took 12.311 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2008/01/05/285-le-design-declaratif-un-nom-degrafa/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Librairie lafabrick : parce que je le vaut bien</title>
		<link>http://www.lafabrick.com/blog/2007/12/06/277-librairie/</link>
		<comments>http://www.lafabrick.com/blog/2007/12/06/277-librairie/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 14:37:45 +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[Flex]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=277</guid>
		<description><![CDATA[Le développement du simulateur Climatus demande une bonne dose d&#8217;architecture pour ne pas ce noyer dans les classes. Et quoi de mieux qu&#8217;un petit framework pour structurer tout ça ?! J&#8217;ai donc démarré le développement d&#8217;une librairie de composants, avec un ensemble de classes pour la gestion de mes vues, que j&#8217;utilise directement dans le [...]]]></description>
			<content:encoded><![CDATA[<p>Le développement du simulateur Climatus demande une bonne dose d&#8217;architecture pour ne pas ce noyer dans les classes. Et quoi de mieux qu&#8217;un petit framework pour structurer tout ça ?!</p>
<p>J&#8217;ai donc démarré le développement d&#8217;une librairie de composants, avec un ensemble de classes pour la gestion de mes vues, que j&#8217;utilise directement dans le simulateur. 3 composants principaux pour l&#8217;instant, dérivés de TitleWindow :</p>
<ul>
<li><strong>DraggableWindow et ResizableWindow</strong> : un TitleWindow draggable et resizable (on s&#8217;en serait douté !), inspiré de plusieurs travaux sur des composants Flex glané sur le web. La notion de Skin à une place importante, et, je l&#8217;espère, moins limitative que certain exemple que l&#8217;on peux trouver&#8230; et d&#8217;autres petites &laquo;&nbsp;features&nbsp;&raquo; que je vous laisse découvrir !</li>
<li><strong>ExpandedWindow</strong> est le concentré des 2 autres, avec une gestion d&#8217;évenements &laquo;&nbsp;minimize&nbsp;&raquo; et &laquo;&nbsp;maximize&nbsp;&raquo;, à la manière de l&#8217;évenement &laquo;&nbsp;close&nbsp;&raquo; du TitleWindow.</li>
</ul>
<p>Je vous propose de découvrir cette petite librairie, via le <a hreflang="fr" href="http://code.google.com/p/lafabrick/">googleCode &laquo;&nbsp;lafabrick&nbsp;&raquo;</a> (pour changer !)</p>
<ul>
<li><a hreflang="fr" href="http://lafabrick.googlecode.com/svn/trunk/bin/lafabrick.swc">lafabrick.swc</a></li>
<li><a hreflang="fr" href="http://lafabrick.googlecode.com/svn/trunk/asdoc/index.html">documentation</a></li>
</ul>
<p><strong>UPDATE</strong><br />
<a hreflang="fr" href="http://lafabrick.free.fr/labo/fabrickFramework/exemple1/">Un petit exemple</a>, avec les sources.</p>
<p>N&#8217;hésitez pas à me faire part de vos réactions, remarques et idées qui me permettront d&#8217;améliorer et d&#8217;étoffer cette librairie.Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/04/06/86-donnez-du-style-votre-flex/" rel="bookmark" title="6 avril 2007">Pimp my Flex</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/05/28/115-flexcubed-flash-flex-resource-exchange/" rel="bookmark" title="28 mai 2007">PixFormat, le prochain compagnon de votre backOffice !</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/01/05/285-le-design-declaratif-un-nom-degrafa/" rel="bookmark" title="5 janvier 2008">Le design déclaratif à un nom : Degrafa</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/09/325-librairie-lafabrick-mise-jour/" rel="bookmark" title="9 mai 2008">librairie lafabrick : mise à jour</a></li>
</ul>
<p><!-- Similar Posts took 11.791 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2007/12/06/277-librairie/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>TileUI : un bureau &#171;&#160;réaliste&#160;&#187; en AS3</title>
		<link>http://www.lafabrick.com/blog/2007/08/07/197-tileui-un-bureau-raliste-en-as3/</link>
		<comments>http://www.lafabrick.com/blog/2007/08/07/197-tileui-un-bureau-raliste-en-as3/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 07:06:20 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[Pure Style]]></category>
		<category><![CDATA[Vu sur le web (2.0)]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[UI Design]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=197</guid>
		<description><![CDATA[Inspiré du projet BumpTop, et dans le même genre que les travaux de Thomas Brault ( et surtout de ) , voici une présentation du projet TileUI. Prenez un bol de Flex , ajoutez une goutte de physique , une pointe de 3D. Secouez pendant une douzaine de jours&#8230; Plus d&#8217;infos ici Démo : www.tileui.comAutres [...]]]></description>
			<content:encoded><![CDATA[<p>Inspiré du projet <a href="http://www.youtube.com/watch?v=M0ODskdEPnQ">BumpTop</a>, et dans le même genre que les travaux de <a href="http://www.tomysnockers.net/2007/07/10/re-member-le-projet-de-premiere-annee-gobelins-est-termine" langref="fr">Thomas Brault</a> ( et surtout de ) , voici une présentation du projet <a href="http://dougmccune.com/blog/2007/08/04/the-making-of-tileui" langref="en">TileUI</a>.</p>
<p> Prenez un bol de Flex , ajoutez une goutte de physique , une pointe de 3D. Secouez pendant une douzaine de jours&#8230;</p>
<p> <object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/6Qkb6fXnIkU"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/6Qkb6fXnIkU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>
<p> Plus d&#8217;infos <a href="http://dougmccune.com/blog/2007/08/04/the-making-of-tileui" langref="en">ici</a><br /> Démo : <a href="http://www.tileui.com">www.tileui.com</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/08/22/204-les-frameworks-as3-qui-vont-bien/" rel="bookmark" title="22 août 2007">Les frameworks AS3 qui vont bien !</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/12/06/277-librairie/" rel="bookmark" title="6 décembre 2007">Librairie lafabrick : parce que je le vaut bien</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/05/28/115-flexcubed-flash-flex-resource-exchange/" rel="bookmark" title="28 mai 2007">PixFormat, le prochain compagnon de votre backOffice !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/08/658-3d-timeline/" rel="bookmark" title="8 janvier 2009">Data visualization : BeeDocs 3D TimeLine Concept</a></li>
</ul>
<p><!-- Similar Posts took 15.322 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2007/08/07/197-tileui-un-bureau-raliste-en-as3/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Pimp my Flex</title>
		<link>http://www.lafabrick.com/blog/2007/04/06/86-donnez-du-style-votre-flex/</link>
		<comments>http://www.lafabrick.com/blog/2007/04/06/86-donnez-du-style-votre-flex/#comments</comments>
		<pubDate>Fri, 06 Apr 2007 13:20:23 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://92.243.2.196/lafabrick/blog/?p=86</guid>
		<description><![CDATA[Flex Style Explorer est une appli Flex pratique et pédagogique, qui vous permet de visualiser et de générer des styles CSS pour vos composants Flex. Ca permet de découvrir rapidement une partie des (nombreuses) propriétés disponibles. C&#8217;est pas exhaustif, au bout d&#8217;un moment vous serez obligé de vous plonger dans la doc, mais pour commencer [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://weblogs.macromedia.com/mc/archives/FlexStyleExplorer.html" hreflang="en">Flex Style Explorer</a> est une appli Flex pratique et pédagogique, qui vous permet de visualiser et de générer des styles CSS pour vos composants Flex. Ca permet de découvrir rapidement une partie des (nombreuses) propriétés disponibles. C&#8217;est pas exhaustif, au bout d&#8217;un moment vous serez obligé de vous plonger dans la doc, mais pour commencer c&#8217;est pratique.</p>
<p>C&#8217;est l&#8217;occasion de signaler que vous pouvez trouver de nouveaux composants sur <a href="http://code.google.com/p/flexlib/" hreflang="en">FlexLib</a> et <a href="http://flexbox.mrinalwadhwa.com/" hreflang="en">FlexBox</a>.</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/05/18/57-pimp-my-flex-la-suite/" rel="bookmark" title="18 mai 2007">Pimp my Flex, la suite&#8230;</a></li>
<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/2008/01/15/291-flex-masquer-les-warnings-inutiles/" rel="bookmark" title="15 janvier 2008">Flex et les warnings inutiles&#8230;</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>
</ul>
<p><!-- Similar Posts took 12.518 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2007/04/06/86-donnez-du-style-votre-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

