【问题标题】:Force screen redraw other than using removeChild() and then addChild() to get image to update?强制屏幕重绘而不是使用 removeChild() 然后 addChild() 来更新图像?
【发布时间】:2011-09-02 01:23:55
【问题描述】:

这是我为回答另一个问题而创建的一些代码。它从库中拉出一个库项目,并以编程方式将其放在舞台上。没什么大不了的,除了为了让屏幕上显示的图像真正更新,我必须先 removeChild() 然后再 addChild() 它回来。还有其他方法可以强制屏幕重绘吗?

var currentImage:int = 1;
var MAX_IMAGES:int = 3;

MC_prevButton.addEventListener(MouseEvent.CLICK, goBack);
MC_nextButton.addEventListener(MouseEvent.CLICK, goForward);

var imageClip:MovieClip = new Image_1();
var thumbClip:MovieClip = new Thumb_1();

imageClip.x = thumbClip.x = stage.stageWidth/2;
imageClip.y = thumbClip.y = stage.stageHeight/2;



addChildAt(thumbClip, 0);
addChildAt(imageClip, 1);

setImages(currentImage);

function goBack(event:MouseEvent):void {
    if (currentImage) currentImage--;
    setImages(currentImage);
}

function goForward(event:MouseEvent):void {
    if (currentImage < MAX_IMAGES) currentImage++;
    setImages(currentImage);
}

function setImages(imageNumber){
    trace("Setting image number: " + imageNumber);

    var LibraryImage:Class = getDefinitionByName("Image_" + imageNumber) as Class;
    if (LibraryImage){
        removeChild(imageClip);
        imageClip = new LibraryImage();
        addChildAt(imageClip, 1);
    }
    var LibraryThumb:Class = getDefinitionByName("Thumb_" + imageNumber) as Class;
    if (LibraryThumb){
        removeChild(thumbClip);
        thumbClip = new LibraryThumb();
        addChildAt(thumbClip, 0);
    }

    imageClip.x = thumbClip.x = stage.stageWidth/2;
    imageClip.y = thumbClip.y = stage.stageHeight/2;
}

请注意,在此示例中,此代码位于时间轴的第 1 帧,并且它是一个 1 帧 FLA 文件

【问题讨论】:

    标签: actionscript-3 redraw addchild


    【解决方案1】:

    尝试在前进和后退方法结束时调用 updateAfterEvent():

    function goForward(event:MouseEvent):void {
        if (currentImage < MAX_IMAGES) currentImage++;
        setImages(currentImage);
        event.updateAfterEvent();
    }
    

    【讨论】:

    • 感谢您的回答,但不,不是这样。 updateAferEvent() 用于在事件循环中强制屏幕重绘,以便在屏幕在进入帧上自然更新之前必须更新。在这种情况下,我们不在进入帧循环中,并且在 setImage() 运行后有足够的时间来刷新屏幕。
    • 实际上再看一遍你我都误解了这个问题:) 当你在 AS3 中调用 addChildAt(imageClip, 1); 时,它会在级别 1 添加图像,但不会像在 AS2 中那样删除图像。相反,新图像是在第 2 级添加的。如果您的图像大小相同,则看起来像没有发生任何事情,因为顶部(第一个)图像隐藏了其余图像。将所有图像的 alpha 设置为 0.5 以查看它们正在被添加,就在它们的后面。如果您将addChildAt 更改为addChild,图像将被添加到其他图像之上。
    • 嘿,感谢您的坚持!好吧,实际上因为我在上面的代码示例中首先调用了 removeChild() (它有效,它只是丑陋),孩子在被添加回舞台之前被移除。在版本(不起作用)中,除了初始化时发生的事情之外,没有 addChild() 。我在开头添加子项,然后在 imageClip 变量中保存对它的引用,稍后我使用 setImages() 函数将其设置为新的库项。
    • 不完全是。您正在删除一个 MovieClip 的实例。然后,您创建一个在库中定义的 MovieClip 的全新实例。这不像您将库中的确切影片剪辑放到舞台上。类是对象的蓝图,而不是对对象的引用。
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多