Проблем с видима светкавица

Пиша инструмент във Flex, който ми позволява да проектирам съставни спрайтове, използвайки наслоени растерни изображения и след това да ги „изпича“ в единични bitmapData с ниска режийна стойност. Открих странно поведение, което не мога да обясня: превключването на свойството „видимо“ на моите слоеве работи два пъти за всеки слой (т.е. мога да го изключа, след това да го включа отново) и след това никога повече за този слой-- слой остава видим от този момент нататък.

Ако отменя „set visible“ на слоя като такъв:

override public function set visible(value:Boolean):void
    {           
        if(value == false) this.alpha = 0;
        else {this.alpha = 1;}
    }

Проблемът изчезва и мога да превключвам „видимостта“ колкото си искам. Някакви идеи на какво може да се дължи това?

Редактиране:

Ето кода, който прави повикването:

private function onVisibleChange():void
{
            _layer.visible = layerVisible.selected;
            changed();
}

Методът changed() "изпича" растерното изображение:

public function getBaked():BitmapData
    {
        var w:int = _composite.width + (_atmosphereOuterBlur * 2);
        var h:int = _composite.height + (_atmosphereOuterBlur * 2);
        var bmpData:BitmapData = new BitmapData(w,h,true,0x00000000);
        var matrix:Matrix = new Matrix();
        var bounds:Rectangle = this.getBounds(this);
        matrix.translate(w/2,h/2);
        bmpData.draw(this,matrix,null,null,new Rectangle(0,0,w,h),true);
        return bmpData;
    }

Между другото, докато слоят все още е видим, с помощта на дебъгера Flex мога да проверя дали видимата стойност на слоя е "false".


person justkevin    schedule 21.04.2010    source източник
comment
Моля, покажете и кода, който използвате, за да превключите видимостта, която ви причинява проблем.   -  person invertedSpear    schedule 22.04.2010


Отговори (1)


Изчакайте рамка между настройката visible и извикването на changed(). Използвайте модела invalidateProperties()/commitProperties().

private bool _isChanged = false;
private function onVisibleChange():void
{
            _layer.visible = layerVisible.selected;
            _isChanged = true;
            invalidateProperties();
}

protected override function commitProperties():void {
    super.commitProperties();

    if (_isChanged) {
        _isChanged = false;
        changed();
    }
}
person Samuel Neff    schedule 22.04.2010