2009-06-18 43 views
1

我是Flex新手,负责增强现有应用程序。其中一项增强功能是让现在显示时间在显示时间和日期之间平稳淡化的时间。等待Flex效果完成

我知道这样做的正确方法是将字体文件嵌入到应用程序中,这样我就可以直接淡入淡出标签。如果可以的话,我尽量避免这种情况,因为我希望尽可能使我的更改尽可能不显眼。

我想出了我认为是一个合理的解决方法:创建一个“隐私屏幕”,恰好是时钟背景的确切大小,形状和颜色;初始化其α为0;然后在更改时间/日期时,淡入隐私屏幕,进行更改,然后再次将屏幕淡出。

的代码看起来是这样的:


    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); 

...与关键部件看起来像这样:


<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"/> 

正如我敢肯定,经验丰富的Flex设计师已经知道,这个代码由美味的新鲜榨制而成FAIL。执行等待淡入效果完成的基本假设是错误的,淡入效果在淡入效果仍在进行时显然被忽略。

所以我想我有两个相关的问题:

  1. 是否有可能得到执行,同时等待完成运行效果暂停?
  2. 这种方法是否可行?还是仅仅是从上到下做错了?

我很感谢任何人都可以提供的见解。

(我提前,更多的我试图通过边学边做这种承认,我越来越意识到我需要利用一些在线trainingresources的自己在那里。)

回答

2

我只是打了一下你的代码,这是你在找什么?

<?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> 

希望帮助:)

+0

啊哈! “效果结束”参数正是我需要的机制,这个示例代码很好地展示了这个概念。你有我的感谢。 – BlairHippo 2009-06-18 22:58:30

+0

你的文章只是幸免于我一些真正的悲伤。谢谢! – noogrub 2012-06-13 15:11:56

1

你的代码被执行标签消失。 this.effectFadeIn.play()不会等待它完成。我会将一个setTimeout调用添加到稍后需要调用的代码行中,或者更好地将它们放入另一个函数中。然后,在一段时间后再次调用该函数。

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; 
} 

我敢肯定这应该工作...

+0

它几乎工作。它需要一点点调整才能完成我所拍摄的内容,因为我希望在隐私屏幕已经消失之后更改文本,但只是将文本更改移到FadeOut函数中就行。我接受了radekg对这个问题的回答,因为它让我感觉更加优雅,并且基于我在其他地方看到的内容,它看起来好像Adobe试图抛弃setTimeout函数。但无论如何+1还是有帮助的;这是完美功能解决方案的核心。:-) – BlairHippo 2009-06-18 23:03:42

+0

在Flex中从未使用的效果,这是我的头顶:-)我也来自Javascript世界,这是如何在JS中完成的。 – Aethex 2009-06-18 23:47:23