强制Flex更新屏幕?

8 apache-flex redraw

这可能是一个初学者的问题,但我不能为我的生活弄清楚.

我正在使用flex为大型项目开发GUI,特别是底部的状态栏.在我的StatusBar类中有一个ProgressBar,其他正在工作的类可以告诉他们进行更新(更改栏完成和标签).我遇到的问题是flex不会更新屏幕上显示的内容,例如,为时已晚

ProgressBar初始化,0%完成
一些类设置ProgressBar为12%完成
一些类做一些工作
一些类设置ProgressBar完成56%

发生的事情是12%完成从未显示,它只是在工作期间挂起0%,然后直接跳到56%完成.我试图理解flex组件的生命周期(失效和验证),我想我理解它并且正确地应用它,但它根本不起作用.我需要告诉flex重绘我的StatusBar(或至少在其中的ProgressBar),在一些类设置为12%完成后,但在一些类开始做它的工作之前.我该怎么做呢?

ian*_*nes 9

正如在其他答案中所提到的,flash播放器是单线程的,如果你不将你的工作分解成可以在单独的"帧"中执行的离散块,你将会看到ui中的跳跃和断断续续,这是实际上你所看到的.

如果你真的必须看到12%的消息,那么使显示列表无效是不够的,因为显示列表没有机会更新,直到56%工作完成后,你必须明确地中断自然事件周期validateNow()设置好消息后的呼叫.

然而,如果性能受到关注,这不是最好的做事方式.您可以通过司法使用callLater()来依次安排每个工作块,因为这将允许玩家在尝试您的流程中的下一步之前可能完成一个框架周期(并更新显示列表).


Flo*_*n F 2

尝试在进度条每次更改后调用 invalidateDisplayList() 。就像是 :

Class StatusBar
{

    public function set progress(value:uint):void
    {
        progressBar.value = value;
        progressBar.invalidateDisplayList();
    }
}
Run Code Online (Sandbox Code Playgroud)

Flex 有一个失效周期,可以避免每次属性更改时屏幕重绘。例如,如果某个属性的值在单个帧中更改 3 次,则它将仅使用最后设置的值进行渲染。您可以通过调用 invidateDisplayList() 强制重绘组件,这意味着 updateDisplayList 将立即执行,而不是等待下一帧。