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

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

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

19mar/095

Flex Item Renderer – Créer un ItemRenderer réutilisable avec listData

Voici la suite de la traduction de l'article de Peter Ent. On va maintenant parler de la création d'ItemRenderers réutilisables (génériques). Pour créer ces itemRenderer génériques, on va faire abstraction des champs sur lesquels on cherche les propriétés. Vous verrez qu'en passant par listData et en remontant un peu la chaîne, on peut récupérer l'information qui nous convient sans mettre de valeur "en dur".

Voici un exemple qui affiche une valeur numérique en utilisant un CurrencyFormatter. Celui-ci va simplement arrondir notre valeur pour qu'elle ait uniquement 2 chiffres après la virgule. Cet ItemRenderer peut être intéressant pour afficher un prix par exemple.

Voici donc le code de l'itemRenderer PriceFormatter:

<?xml version="1.0" encoding="utf-8"?>
<mx:Text xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:Script>
		<![CDATA[
			import mx.controls.dataGridClasses.DataGridListData;

			[Bindable] private var formattedValue:String;

			override public function set data(value:Object):void
			{
				super.data = value;

				formattedValue = cfmt.format( Number(data[(listData as DataGridListData).dataField]) );

			}
		]]>
	</mx:Script>

	<mx:CurrencyFormatter precision="2" id="cfmt" />

	<mx:text>{formattedValue}</mx:text>

</mx:Text>

Le point-clé de cet ItemRenderer est la partie indiquée en orange, qui modifie la variable bindable formattedValue. Tout d'abord, vous pouvez voir que le <mx:CurrencyFormatter> a été défini grâce à un tag MXML (vous pourriez le faire en ActionScript si vous le souhaitiez) avec l'id "cfmt". Dans cet exemple, formattedValue est donnée par le résultat de l'appel à la fonction format() du CurrencyFormatter.

30oct/084

Flex UIComponent – Les Composants de type Texte (Label, Text, TextInput, TextArea, RichTextEditor)

Il y a 5 types de composants texte, que l'on peut classer comme affichage ou comme input.

This movie requires Flash Player 11

Les composants Label et Text sont des composants d'affichage seulement. L'utilisateur ne peut pas éditer le contenu de ces types. Le composant Label est utile pour afficher une ligne de texte alors que le composant Text peut afficher plusieurs lignes à la fois.