【问题标题】:Delay text appearance animation when period appears出现句号时延迟文本出现动画
【发布时间】:2013-08-29 17:30:44
【问题描述】:

这里是 Flash/AS3 新手。

我正在尝试逐字母显示文本(效果很好)。但是,我希望动画在每次遇到句号/句末时延迟约 500 毫秒。到目前为止,我的代码的相关部分如下所示:

public function displayLoop(e:Event):void
    {
        if (pos == textToDisplay.length - 1)
        {
            stop();
            return;
        }

        firstParagraph.appendText(textToDisplay.charAt(pos));
        if (textToDisplay.charAt(pos) == String.fromCharCode(46))
        {
            //here's where I want to delay??
        }
        pos++;
    }

在这种情况下,firstParagraph 是我的动态文本对象的名称,textToDisplay 是要逐个字母显示的文本字符串,而 pos 只是我们在显示文本时所处的位置,这样我们就可以跟踪它。

我猜这个问题有一个简单的解决方案,也许使用 Timer EventHandler?

感谢任何人提供的任何帮助,谢谢!

【问题讨论】:

  • 显示更多代码。最具体地说是与计时器有关的任何事情
  • 我没有计时器,我的问题是想知道这是否是实现我正在寻找的效果的最佳途径。很抱歉造成混乱。
  • 在 SO 上发布问题时,请尽量保持一致,这个问题的标题与您在上面的评论中提出的问题非常不同。此外,最佳路线/实践问题通常不受欢迎,因为它是基于意见的,因此没有真正的答案。

标签: actionscript-3 flash


【解决方案1】:

我认为以下内容将有助于编写您想要的代码:

String.split() - 此方法将帮助您将段落拆分为句子并将它们存储在数组中。 (请记住,并非所有句点都是句号,因此您可能需要使用一些正则表达式来处理特殊情况,例如当它们用作省略号或小数时。):

例如

textToDisplay.split('.');

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/String.html#split()

Array.shift() - 此方法将返回数组中的第一个元素,然后将其从数组中删除。如果您将句子存储在数组中,则可以继续调用 shift() 以获取下一个需要显示的句子:

例如

var sentences:Array = textToDisplay('.');
var next_sentence:String = sentences.shift();

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#shift()

定时器 - 这个对象,就像你提到的,将帮助你创建附加句子之间的延迟间隔:

例如

var myTimer:Timer = new Timer(1000, sentences.length);
myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
myTimer.start();

function timerHandler(e:Event) {
    firstParagraph.appendText(sentences.shift());
}

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Timer.html

【讨论】:

    【解决方案2】:

    由于计时器内置了一个计数器,因此无需跟踪位置。

    import flash.text.TextField;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    
    var textToDisplay:String = 'AB.CDE.FGHI.JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    var tf:TextField = new TextField()
    tf.width = 500
    tf.wordWrap = true
    tf.height = 400
    addChild(tf)
    var timer:Timer = new Timer(100)
    timer.addEventListener(TimerEvent.TIMER, onTimer)
    timer.start()
    function onTimer(e:TimerEvent):void{
        timer.delay = 100
        tf.appendText(textToDisplay.slice(timer.currentCount-1,timer.currentCount))
        if(timer.currentCount == textToDisplay.length){
            timer.stop()
        }
        if(textToDisplay.slice(timer.currentCount-1,timer.currentCount) == '.'){
            timer.delay = 500
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2021-04-06
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多