0

运行此代码

        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在第一帧工作吗?

4

1 回答 1

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 开发人员的首选方式。)

将对象添加到舞台后,您只能执行一次绘制调用,但我不知道如果对象发生更改会有多安全。

于 2012-10-18T08:28:45.407 回答