代码之家  ›  专栏  ›  技术社区  ›  BlairHippo

等待弯曲效果完成

  •  1
  • BlairHippo  · 技术社区  · 17 年前

    我是一个负责增强现有应用程序的灵活新手。其中一个增强是获得当前显示在显示时间和日期之间平滑淡入淡出时间的字段。

    我知道正确的方法是将字体文件嵌入到应用程序中,这样我就可以直接淡入淡出标签。如果可以的话,我尽量避免这样做,因为我更愿意尽可能不引人注目地进行更改。

    我想出了一个合理的解决方法:创建一个“隐私屏幕”,恰好是时钟背景的准确大小、形状和颜色;将其alpha初始化为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设计师已经知道的,这个代码是由美味的鲜榨而成的。 失败了。 执行将等待淡入效果完成的基本假设是错误的,淡出效果明显被忽略,而淡入仍在进行中。

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

    1. 是否可以在等待效果运行完成时暂停执行?
    2. 这种方法是可行的,还是仅仅是自上而下犯错误的臭味?

    我提前感谢大家提供的任何见解。

    (我提前承认,我越想通过这样做来学习,我就越意识到我需要利用一些网络 training resources 在那里。)

    2 回复  |  直到 17 年前
        1
  •  2
  •   radekg    17 年前

    我只是在玩你的代码,这是你要找的吗?

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

    希望有帮助:)

        2
  •  1
  •   Aethex    17 年前

    您的代码已执行 虽然 标签变淡。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;
    }
    

    我很肯定这会奏效…

    推荐文章