平滑地在屏幕上移动文本

时间:2014-07-03 15:21:13

标签: actionscript-3 actionscript textfield bitmapdata

很长一段时间以来,我一直在寻找这个问题的解决方案,所以当搜索没有澄清任何内容时,我决定发布一个步骤。

我有一个应该在屏幕上移动的文本字段。我通过"输入框架功能"动态地为其x值添加速度来解决这个问题。然而,这场运动非常“迟钝”。并且包括突然的&​​#34;跳跃"在运动中。我已经尝试了几种可能的解决方案,所有这些都没有运气。

  • 嵌入字体
  • 更改文本字段的antiAliasType
  • 使用像这样的BitmapData:

    bmd = new BitmapData (myTextField.width, myTextField.height, true, 0);
    bmd.draw (myTextField);
    
    bm = new Bitmap (bmd);
    bm.x = myTextField.x;
    bm.y = myTextField.y;
    bm.cacheAsBitmap = true;
    bm.smoothing = true;
    this.addChild(bm);`
    

    然后移动" bm"实例

这些方法都不起作用。

编辑:根据请求,我正在为文本的实际移动添加相关代码。

stage.addEventListener(Event.ENTER_FRAME, time);

private function time(evt:Event):void
{
    bm.x-= textSpeed;
}

变量textSpeed定义为public static var。它的值是2。

* EDIT2:我准备了一个干净的fla文件,除了移动文本之外什么都没有。这里也出现了同样的滞后现象。代码位于操作面板中。 Download link

2 个答案:

答案 0 :(得分:1)

Flash IDE的工作方式是,设置帧率实际上是“最大值”。帧率。也就是说,它不会强制动画以该速率运行 - 它可以根据机器和可用资源而变化。

据我所知,没有办法强制Flash以某个帧速率运行 - 制作动画的最佳方式是“平滑”。是使用像TweenLite这样的Tween类。

如果您需要通过递增位置值进行动画处理,那么我建议将其设置为基于时间,例如:

var fps = 24;

var moveTimer:Timer = new Timer(1000/fps);


moveTimer.addEventListener(TimerEvent.TIMER, onMoveTimer);
moveTimer.start();
function onMoveTimer(e:TimerEvent){
    bm.x -= 1;
}

同样,这并不能解决动画的流畅性,但它在不同的机器上比使用输入框架更可靠。

答案 1 :(得分:0)

尝试增加帧速率。因为您自然会尝试在动画时阅读文本,所以通常可以注意到24fps帧之间的间隙。尝试将stage.frameRate设置为30,48或60(最大值为60)并查看是否可以解决您的问题。我在过去使用动画文本时遇到了类似的问题,并且提高帧速率已经修复了它们。

我还建议只根据需要增加它。您更有可能丢弃具有更高帧速率的帧(具有逻辑意义;每帧在帧速率增加时计算的时间更短),因此您可能希望执行以下操作:

stage.frameRate = 48;
// run animations here
stage.frameRate = 24; // in an Event.COMPLETE handler

这将确保您的动画流畅,同时为您的应用程序的其余部分提供在较小设备上运行良好的最佳镜头。如果您正在运行大量动画,则可以考虑将其永久保持升级。

您还应该考虑使用Greensock动画库(TweenLite / TweenMax)而不是Flash的内置补间。 Greensock在功能和性能方面具有非常优越的API,特别是在移动设备上。