为什么scrollRect只在下一帧中产生影响?

时间:2012-10-18 07:19:16

标签: actionscript-3 flash

运行此代码

        var sp:Sprite = new Sprite();
        sp.graphics.beginFill(0xff);
        sp.graphics.drawRect(0,0,400,400);
        sp.graphics.endFill();
        sp.scrollRect = new Rectangle(0,0,350,350);
        addChild(sp);

        var count:int = 0;
        var f:Function = function(...args):void{
            trace(count++,sp.width,sp.height);
            if(count>5){
                removeEventListener(Event.ENTER_FRAME,f);
            }
        }
        addEventListener(Event.ENTER_FRAME,f);

获取

0 400 400
1 350 350
2 350 350
3 350 350
4 350 350
5 350 350

无论如何我可以让scrollRect在第一帧工作吗?

1 个答案:

答案 0 :(得分:3)

我刚检查过,它可能是因为Flash Player中有一些内部渲染内容(它实际上需要两帧来获取真实尺寸,当前尺寸和之后的尺寸)。在视觉上,矩形不会改变大小,因此它只是两帧后更新的对象边界的值(您可以通过设置非常低的帧速率,例如1 FPS来轻松证明这一点。)

一种解决方法是通过将舞台绘制到1x1 BitmapData来强制执行“硬”渲染过程...这将有效地更新整个显示列表,并且这些值应该在draw()调用之后立即正确。所以你的代码看起来像这样:

var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xff);
sp.graphics.drawRect(0,0,400,400);
sp.graphics.endFill();
sp.scrollRect = new Rectangle(0,0,350,350);
addChild(sp);

var count:int = 0;
function f(event:Event = null):void{
    new BitmapData(1,1).draw(stage);
    trace(count++,sp.width,sp.height);
    if(count>5){
        removeEventListener(Event.ENTER_FRAME,f);
    }
}
addEventListener(Event.ENTER_FRAME,f);
f();

(请注意,我更改了您声明函数的方式,因为这是大多数(如果不是全部)Flash开发人员的首选方式。)

在将对象添加到舞台后,您只能进行一次绘制调用,但我不知道对象更改时的安全性。