Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

18fév/111

Flex Tips – Label de largeur variable et troncature (truncateToFit)

Un petit article pour un petit "tip" sur Flex 3. Le problème se produit en fait lorsque l'on définit la largeur d'un label en pourcentage, comme par exemple:

<mx:Label text="This is a really long label" width="100%"/>

Si le conteneur qui est autour de ce composant Label est plus petit que la largeur du texte, celui-ci sera coupé de manière stricte. Le plus propre serait de tronquer le label en affichant "…" à la fin avec la valeur en toolTip. C'est ce qui se passe de base si vous donnez une largeur fixe au champ texte.

Il existe une propriété qui se nomme "truncateToFit" qui semble être la solution à tous nos problèmes. Seulement, si vous passez cette propriété à true, vous ne verrez aucun changement.

Il y a en revanche une solution trouvée par Daniel R. dans cet article:

Truncating labels that use a percentage width

La solution est en fait de donner une "minWidth" de 0 pour que le comportement soit correct. Vous n'avez en fait même pas besoin de la variable truncateToFit:

 <mx:HBox width="100" horizontalScrollPolicy="off">
  <mx:Label text="This is a very very very long text" width="100%" minWidth="0" />
 </mx:HBox>
Remplis sous: Label, MXML 1 commentaire
18nov/102

Détecter le click sur un lien dans un texte HTML (TextEvent.LINK)

Tutorial Flex écrit par Laurent Wroblewski (http://flex-ria.fr/)
Publiez vous aussi sur flex-tutorial!

Vous utilisez le composant Flex Label (ou les composants qui l'étendent, comme Text), et vous souhaitez pouvoir réagir à un clic sur une portion
de son contenu? Pas si simple!

Imaginons un label doté du texte suivant : "Ceci est un exemple de LIEN vers une image!". Vous souhaitez qu'un clic sur le mot "LIEN" entraîne l'affichage d'une image à l'écran. Pour ce faire, nous allons passer par la propriété htmlText du composant et utiliser des balises HTML <a> pour encadrer le mot "LIEN". Seul petit problème, en utilisant cette balise de manière traditionelle (ex : <a href='assets/test.jpg'>), un clic sur le texte redirigera la page vers le lien inséré (dans notre exemple, vers
l'image assets/test.jpg). Pas vraiment ce que nous voulons...

L'astuce ici est d'utiliser cette syntaxe :

<a href='event:assets/test.jpg'>

Ainsi, un clic sur le texte entraînera le dispatch d'un événement de type TextEvent.LINK depuis votre composant Label, que vous aurez tout loisir de capturer au sein d'un handler pour effectuer un traitement de votre choix.

IMPORTANT : pour qu'un événement de type TextEvent.LINK soit dispatché depuis un Label, la propriété selectable de celui-ci doit être à true.

<mx:Script>
    <![CDATA[
        private function txtExemple_LinkHandler(evt:TextEvent):void
        {
            trace(evt.text);
        }

        private function txtExemple_InitializeHandler(evt:Event):void
        {
            this.txtExemple.htmlText = "Ceci est un exemple de <a href='event:assets/test.jpeg'>LIEN</a> vers une image!";
        }
    ]]>
</mx:Script>

<mx:Text id="txtExemple"
    initialize="txtExemple_InitializeHandler(event)"
    link="txtExemple_LinkHandler(event)"
    selectable="true"
    />

Dans l'exemple ci-dessus, en imaginant que l'utilisateur clique sur le mot "lien" du texte du composant txtExemple, un événement de type TextEvent sera dispatché, dont la propriété text sera égale à assets/test.jpeg. Après, libre à vous d'effectuer le traitement que vous souhaitez.

L'exemple ci-dessous va créer une image dont l'url sera renseignée dans le lien, et l'afficher dans l'application à la position du pointeur de la souris.
Un second clic sur l'image fera disparaître celle-ci. Attention, pour que l'image se positionne correctement, il faut que son container (dans mon cas l'Application) ait un layout de type absolute (un Canvas par exemple).

private var _image:Image;

private function txtExemple_LinkHandler(evt:TextEvent):void
{
    if (!this._image)
    {
        this._image = new Image();
        this.addChild(this._image);
    }
    this._image.source = evt.text;
    this._image.x = this.contentMouseX;
    this._image.y = this.contentMouseY;
    this._image.visible = this._image.includeInLayout = true;
    this._image.useHandCursor = this._image.buttonMode = true;
    this._image.addEventListener(MouseEvent.CLICK, image_ClickHandler, false, 0, true);
}

private function image_ClickHandler(evt:MouseEvent):void
{
    this._image.visible = this._image.includeInLayout = false;
}

Exemple en ligne

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

1juin/104

Flex 4 – (4) Structure des composants Flex 4 et comparaison avec Flex 3

La hiérarchie interne des composants Flex a légèrement changé. Parfois, certains noms ont changé, et parfois, on va exposer ce qui vous était auparavant caché.

Le cas des composants

Prenons par exemple, l'instanciation d'un bouton en Flex:

<s:Button />

Lorsque vous instanciez un bouton, plus d'un objet sera crée. Voici schématiquement ce qui sera crée d'un point de vue Layout:

Slide3

Note: Dans ce schéma, TextBox est en fait Label.

Un fichier Skin sera instancié et mis dans la liste d'affichage du Button. Voici à quoi ressemble la skin d'un Button Flex 4:

<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"  minWidth="23" minHeight="23">

    <fx:Metadata>
    	[HostComponent("mx.components.Button")]
    </fx:Metadata>

    <s:states>
        <s:State name="up" />
        <s:State name="over" />
        <s:State name="down" />
        <s:State name="disabled" />
    </s:states>

    <!-- background -->
    <s:Rect left="0" right="0" top="0" bottom="0"
    	  width="70" height="23"
    	  radiusX="2" radiusY="2">
        <s:stroke>
            <s:SolidColorStroke color="0x5380D0" color.disabled="0xA9C0E8" />
        </s:stroke>
        <s:fill>
            <s:SolidColor color="0xFFFFFF" color.over="0xEBF4FF" color.down="0xDEEBFF" />
        </s:fill>
    </s:Rect>

    <!-- label -->
    <s:Label id="labelDisplay" />

</s:Skin>

Même si dans votre code MXML, on dirait que votre composant est tout en bas de la hiérarchie, à travers sa skin, d'autres composants enfants seront créés. Pour accéder à ces éléments, vous pouvez utiliser la propriété "skin", présente sur tous les composants de type SkinnableComponent (Flex 4).

A travers la propriété "skin", vous aurez accès à l'instance de ButtonSkin, qui vous permettra d'accéder au Rectangle et au Label. Pour accéder au Label, vous pourriez faire:

myButton.skin.getElementAt(2) ou myButton.skin.labelDisplay

Vous pouvez accéder directement au Label par "labelDisplay" car c'est une "skin part". On reviendra plus en détail sur les "skin part" dans un prochain tutorial de ce fil rouge.

Le cas des conteneurs

Principalement, les mêmes règles s'appliquent aux conteneurs, qui sont appelés dérivent de SkinnableContainers en Flex 4.

Les SkinnableContainers sont des conteneurs qui ont nativement des enfants, mais ils sont aussi (par héritage), des SkinnableComponent, ayant une skin, et ont donc aussi des enfants par cette skin.

Prenons un exemple sur un Panel:

<s:Panel>
    <s:Button />
    <s:Label />
    <s:CheckBox />
</s:Panel>

Ce panel  trois enfants: un bouton, un label et une checkbox. Pour y accéder, vous pouvez utiliser l'API définie sur SkinnableContainer.

2avr/101

Flex 4 – Layout Mirroring pour texte right-to-left (Hébreu, Arabe, …)

Avant de partir en vacances une petite dizaine de jours (pas de blog donc ^^), voici une petite news de la part de la team Adobe Flex SDK.

La nouvelle Product Manager sur Flex, Deepa Subramaniam vient d'annoncer sur son blog une des nouveautés qui va arriver avec les prochaines release de Flex 4 (et oui, ils continuent à travailler dessus ;) ).  Cette nouvelle fonctionnalité est nommée "Layout Mirroring".

Elle sert à faire un effet "miroir" (pas un effet réflexion web 2.0) vertical pour les applications utilisant une mise en page qui doit être adaptée au texte qui s'écrivent de droite à gauche comme l'Hébreu ou l'Arabe.

Mirroring layouts in Flex

Dans la pratique, cet effet miroir se traduit par une nouvelle propriété de style "layoutDirection" sur UIComponent. Celle-ci est par défaut à "ltr" (left-to-right, le standard Français / Anglais) mais vous pouvez la passer à "rtl". Notez que comme les autres propriétés de style, celle-ci se "cascade" dans votre application. C'est-à-dire qu'il suffit de mettre votre Application en layout "rtl" pour que cela se propage à tous les composants UIComponent de votre Application.

Toute cette manipulation se fait grâce au nouveau moteur de texte "Flash Text Engine" introduit dans Flex 4. Pour que toute votre application puisse avoir cet disposition miroir, il faut donc que tous vos composants utilisent ce FTE. Pour cela, il suffit de préciser dans les propriétés de compilation de votre projet Flex 4 "Use Flash Text Engine in Flex Components".

Spécifications sur le Layout Mirroring

Si vous voulez tester, il vous faut un des derniers build de Flex 4.1 disponible sur le site d'Adobe. En effet, vous aurez accès à cette fonctionnalité à partir de la release "4.1.0.15132".

Télécharger la release Flex SDK 4.1.0.15132

Télécharger les dernières versions de Flex 4 SDK

26mar/097

Composant Flex – Texte Défilant type Marquee (ScrollingText)

Vous avez sûrement déjà vu sur des sites ayant des design type sites des années 80, ces textes défilants "Bienvenue sur mon site!". Pour cela, soit un peu de JavaScript, soit du html avec la balise marquee: <marquee>Bienvenue sur mon site!</marquee>. C'était plutôt affreux (à mon goût) mais admettons que vous vouliez créer le même effet dans votre application Flex, pour lui donner un air vintage peut-être.

Et bien Peter Ent a crée un composant permettant de faire ce texte défilant sous Flex. Ce composant est baptisé ScrollingFlex, voici un exemple de son utilisation:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:controls="com.keaura.controls.*"
	creationComplete="{scrollinText.start();scrollinText2.start();}">
	<controls:ScrollingText id="scrollinText" text="De gauche à droite" direction="leftToRight" speed="2" width="100%" height="30"/>
	<controls:ScrollingText id="scrollinText2" text="De haut en bas" direction="topToBottom" speed="3" width="100%" height="30"/>
</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

Plusieurs paramètres sont à disposition:

  • direction: les 4 directions sont possibles (gauche à droite, haut en bas ...)
  • speed: vitesse de déplacement du texte
  • text: le texte à faire défiler

Attention, n'oubliez pas de donner une height à votre composant, la hauteur de base est de 0 sinon et vous ne verrez rien. N'oubliez pas non plus de lancer le défilement avec la méthode start()