0

現在、マウスオーバーイベントでスプライトに読み込まれた画像を変更し、mouseoutで元に戻そうとしています。しかし、それは正しく機能していません、私は何かが欠けていますか?

public class Tab extends Sprite
{
    var imageLoader:Loader = new Loader();
    var TabSprite:Sprite = new Sprite();
    var SkinImages:Array = [Skin.TAB_ACTIVE,Skin.TAB_DISABLED,Skin.TAB_HOVER,Skin.TAB_VIEW];

    public function Tab()
    {   
        for each (var Image:String in SkinImages){
            imageLoader.load(new URLRequest(Image));
        }

        TabSprite.buttonMode = true;
        addChild(TabSprite);

        TabSprite.addChild(imageLoader);
        TabSprite.addEventListener(MouseEvent.MOUSE_OVER, onTabHover);
    }


    private function onTabHover(e:MouseEvent){
        trace("HOVER");
        TabSprite.removeEventListener(MouseEvent.MOUSE_OVER, onTabHover);
        imageLoader.load(new URLRequest(Skin.TAB_HOVER));
        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event):void{
            TabSprite.addEventListener(MouseEvent.MOUSE_OUT, onTabOut);
        });

    }

    private function onTabOut(e:MouseEvent){
        trace("OUT");
        TabSprite.removeEventListener(MouseEvent.MOUSE_OUT, onTabOut);
        imageLoader.load(new URLRequest(Skin.TAB_VIEW));
        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event):void{
            TabSprite.addEventListener(MouseEvent.MOUSE_OVER, onTabHover);
        });

    }
}
4

1 に答える 1

1

リスナーをそのようにネストするべきではありません。コンストラクターに2つ追加するだけです。

TabSprite.addEventListener(MouseEvent.ROLL_OVER, onTabHover);
TabSprite.addEventListener(MouseEvent.ROLL_OUT, onTabOut);

ほとんどの場合、MOUSE_OVERをROLL_OVERに変更する方がよいことに注意してください。また、すべてのマウスイベントで画像をロードするべきではありません。それらをプリロードしてから使用します。また、リスナーで匿名関数を使用することは、そのリスナーを削除できないため、悪い習慣です。

imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(e:Event):void{
        TabSprite.addEventListener(MouseEvent.MOUSE_OUT, onTabOut);
    });

そして実際、あなたはそれを削除していません-これは悪いことです。

    for each (var Image:String in SkinImages){
        imageLoader.load(new URLRequest(Image));
    }

うまくいくとは思えませんが、1つのローダーで一度に多くの画像を読み込むことはできないと思います。

これを試して:

public class Tab extends Sprite
{
var imageOverLoader:Loader = new Loader();
var imageOutLoader:Loader = new Loader();
var TabSprite:Sprite = new Sprite();
var SkinImages:Array = Skin.TAB_ACTIVE,Skin.TAB_DISABLED,Skin.TAB_HOVER,Skin.TAB_VIEW];

public function Tab()
{   

    TabSprite.buttonMode = true;
    this.addChild(TabSprite); // you also need to add as a Child "Tab" object in the Main Class

    imageOutLoader.load(new URLRequest(Skin.TAB_VIEW));
    imageOverLoader.load(new URLRequest(Skin.TAB_HOVER));
    TabSprite.addChild(imageOutLoader);

    TabSprite.addEventListener(MouseEvent.ROLL_OVER, onTabHover);
    TabSprite.addEventListener(MouseEvent.ROLL_OUT, onTabOut);
}


private function onTabHover(e:MouseEvent){
    TabSprite.removeChild(imageOutLoader);
    TabSprite.addChild(imageOverLoader);

    trace("HOVER");

}

private function onTabOut(e:MouseEvent){
    TabSprite.removeChild(imageOverLoader);
    TabSprite.addChild(imageOutLoader);

    trace("OUT");

}
}

これを試して。

于 2012-05-01T11:55:18.200 に答える