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
Flex Tooltip – Texte HTML (et images) dans un tooltip Flex
Les tooltips Flex peuvent être ajoutés sur tous les composants visuels Flex. Au survol, une info-bulle apparait avec le texte spécifié. Cela peut permettre de sauver de la place en y mettant un texte explicatif que l'utilisateur ne voit que lorsqu'il se déplace sur une zone / un composant.
Flex ToolTip – Ajouter des ToolTips à vos composants
Pour les harmoniser avec votre application, vous pouvez leur appliquer un style. Mais ces propriétés de style ne vont pas bien loin.
Heureusement, on peut aller encore plus loin en intégrant du texte HTML. Vous pourrez ainsi afficher des informations en gras ou en couleur. Vous pouvez en fait intégrer toutes les balises gérées par la propriété htmlText de la classe Text. Y compris le tag <img> qui va vous permettre d'afficher des images dans les info-bulles:
Voir l'article original: Easy Flex ToolTip customization using HTML tags
Flex Localization – Pré-chargement de Resource Modules (preload)
Vous pouvez charger un Resource Module quand l'application démarre en appelant la méthode loadResourceModule() au moment de l'évènement initialize, et en spécifiant une valeur pour la propriété localeChain une fois que le module est chargé. C'est utile si vous avez une langue par défaut et que vous voulez que tous les utilisateurs démarrent avec cette langue.
Vous pouvez aussi spécifier la locale que l'application va charger par défaut en la passant en FlashVars dans le conteneur HTML.
Voici les variables flashVars que vous devez passer pour précharger les Resource Modules:
- localeChain: Une liste (séparateur ",") de locale pour l'initialisation de la propriété localeChain de la classe ResourceManager. Si la propriété localeChain n'est pas explicitement fixée, localeChain sera initialisée avec la valeur passée dans l'option -locale du compilateur
- resourceModuleURLs: Une list (séparateur ",") d'URL depuis lesquelles les Resource Module seront chargés. Les resource Modules sont chargés pas la même classe que les RSLs, mais sont chargés après les RSLs. Ces URLs peuvent être relatives ou absolues
Comme pour des paramètres dans une URL, vous devez séparer ces valeurs par un "&" et vous devez vous assurer que les caractères sont bien encodés.
Adobe Air – Composant mx:HTML avec contenu SWF et Garbage Collection
Aujourd'hui, je suis tombé sur cet article de Gregory Wilson expliquant les problèmes de fuites mémoire (memory leak) rencontrés avec l'application Adobe Air Tour de Flex. Pour ceux qui ne connaissent pas Tour de Flex, c'est une application Air pour montrer les capacités du SDK Flex avec des applications exemple (et le code source). Si vous ne l'avez pas encore sur votre poste, je vous la conseille vivement:
Télécharger l'application Tour de Flex (Adobe Air)
L'application Tour de Flex utilise un composant <mx:HTML> (qui fait partie du SDK Air) permettant d'afficher des pages HTML dans une application. Dans ce cas précis, il est surtout utilisé pour afficher du contenu SWF (pris depuis un page HTML classique). Si vous jouez un peu avec l'application, vous vous rendrez compte qu'elle monte très rapidement en RAM, à cause principalement d'une fuite mémoire (Memory Leak).
Au passage, si vous voulez en apprendre plus sur la gestion des ressources AS3 et le Garbage Collector, je vous conseille vivement de lire ces articles:
Flex Debug - Garbage Collector AS3 et Flash Player 9
Flex Debug - Garbage Collector AS3: Gestion des ressources
Gregory Wilson a donc identifié cette fuite mémoire du composant <mx:HTML> et cela pourra vous être utile si votre application Adobe Air utilise elle aussi ce composant. Pour résumer le problème, si un composant mx:HTML charge une page avec du contenu Flash (SWF), le composant ne peut pas être libéré d'un point de vue mémoire, même si vous le supprimez de son conteneur, lui enlevez ses références, etc. Le contenu Flash continue de s'exécuter.
Pour résoudre ce problème, il faut fixer l'attribut "htmlText" à une chaîne vide("") et le Garbage Collector pourra passer.






