2009-06-18 6 views
1

Je suis une recrue Flex chargée d'améliorer une application existante. Une de ces améliorations est d'obtenir le champ qui montre actuellement l'heure de se fondre en douceur entre l'affichage de l'heure et la date.En attente de la fin des effets Flex

Je sais que la bonne façon d'y parvenir est d'incorporer le fichier de police dans l'application afin que je puisse fondre l'étiquette directement. J'essaie d'éviter cela si je le peux, car je préférerais que mes changements soient aussi discrets que possible. Je suis arrivé avec ce que je pensais être une solution de contournement raisonnable: créer un «écran de confidentialité» qui se trouve être la taille exacte, la forme et la couleur de l'arrière-plan de l'horloge; initialise son alpha à 0; puis, lorsque vous modifiez l'heure et la date, faites un fondu dans l'écran de confidentialité, effectuez le changement et retirez l'écran à nouveau.

Le code ressemble à ceci:


    var targets:Array = new Array(); 
    targets.push(this.privacyScreen); 
    this.effectFadeIn.play(targets); 
    this.mylabel.text = "I am a date and/or time"; 
    this.effectFadeOut.play(targets); 

... avec les éléments clés qui ressemble à ceci:


<mx:Label text="" id="mylabel" width="100%" height="100%" x="0" y="0" color="0xff0000"/> 
<mx:Canvas id="privacyScreen" width="100%" height="100%" x="0" y="0" alpha="1" backgroundColor="{myConfiguration.backgroundColor}"/> 
<mx:Fade id="effectFadeIn" alphaFrom="0.0" alphaTo="1.0" duration="250"/> 
<mx:Fade id="effectFadeOut" alphaFrom="1.0" alphaTo="0.0" duration="250"/> 

Comme je suis sûr que les concepteurs Flex expérimentés savent déjà, ce code est fabriqué à partir de délicieux frais pressés FAIL. L'hypothèse de base que l'exécution attendra la fin de l'effet de fondu est fausse, et l'effet de fondu est apparemment ignoré alors que le fondu d'entrée est toujours en cours.

Je suppose que j'ai deux questions connexes:

  1. Est-il possible d'obtenir l'exécution de faire une pause en attendant un effet de courir à la fin?
  2. Cette approche est-elle même viable, ou est-ce que cela peut tout simplement empoisonner le tout de haut en bas?

Merci d'avance pour tout aperçu que tout le monde peut offrir.

(Et je l'avoue à l'avance que plus j'essaie d'apprendre cela en faisant, plus je me rends compte que je dois me servir d'une partie de la ligne trainingresources là-bas.)

Répondre

2

J'ai joué un peu avec votre code, est-ce que vous cherchez?

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" 
    creationComplete="onComplete();"> 

    <mx:Script> 
     <![CDATA[ 
      private var targets:Array = new Array(); 
      private function onComplete():void { 
       targets.push(canv); 
       effectFadeOut.play(targets); 
      } 
      private function onFadeInEnd():void { 
       effectFadeOut.play(targets); 
      } 
      private function onFadeOutEnd():void { 
       effectFadeIn.play(targets); 
      } 
     ]]> 
    </mx:Script> 

    <mx:Label text="{(new Date()).toString()}" id="lbl" x="0" y="0" color="0xff0000"/> 
    <mx:Canvas id="canv" width="100%" height="{lbl.height+5}" x="0" y="0" backgroundColor="#000000"/> 

    <mx:Fade id="effectFadeIn" alphaFrom="0.0" alphaTo="1.0" duration="250" 
     effectEnd="onFadeInEnd();" /> 
    <mx:Fade id="effectFadeOut" alphaFrom="1.0" alphaTo="0.0" duration="250" 
     effectEnd="onFadeOutEnd();" /> 

</mx:WindowedApplication> 

Hope that helps :)

+0

Ah-ha! Le paramètre "effectEnd" était précisément le mécanisme dont j'avais besoin pour le retirer, et cet exemple de code démontre très bien le concept. Vous avez mes remerciements. – BlairHippo

+0

Votre message m'a tout simplement épargné un vrai chagrin. Merci! – noogrub

1

Votre code est exécuté tandis que l'étiquette s'estompe. this.effectFadeIn.play() n'attend pas qu'il se termine. J'ajouterais un appel setTimeout aux lignes de code que vous devez appeler plus tard, ou mieux encore, les mettre dans une autre fonction. Ensuite, appelez à nouveau la fonction après un certain intervalle.

import flash.utils.*; 

private function FadeIn() : void { 
    var targets:Array = new Array(); 
    targets.push(this.privacyScreen); 
    this.effectFadeIn.play(targets); 
    this.mylabel.text = "I am a date and/or time"; 
    setTimeout (function(): void {FadeOut (targets);}, effectFadeIn.duration); // Function and duration 
} 
private function FadeOut (targets : Array) : void { 
    this.effectFadeOut.play(targets); 
    setTimeout (FadeIn(), this.effectFadeOut.duration; 
} 

Je suis assez sûr que cela devrait fonctionner ...

+0

Il fonctionne presque. Il a fallu un peu de peaufinage pour accomplir ce que je visais, car je voulais que le texte change APRÈS la disparition de l'écran de confidentialité, mais le simple fait de déplacer le texte dans la fonction FadeOut fait l'affaire. J'ai accepté la réponse de radekg par rapport à celle-ci parce que cela me semble plus élégant et d'après ce que j'ai lu ailleurs, il semble qu'Adobe tente de déprécier la fonction setTimeout. Mais +1 pour l'aide de toute façon; c'est le noyau d'une solution parfaitement fonctionnelle.:-) – BlairHippo

+0

Jamais utilisé d'effets dans Flex, ce n'était pas le top de ma tête :-) Je suis aussi du monde Javascript, et c'est comme ça qu'on le ferait en JS. – Aethex

Questions connexes