2012-05-01 3 views
0

現在、私はmouseoverイベントでスプライトに読み込まれたイメージを変更し、mouseoutで元に戻そうとしています。しかし、それは正しく動作していない、私は何かが不足している?AS3マウスオーバーイメージを変更

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); 
     }); 

    } 
} 
+0

私はあなたが本当に両方の画像を前面に読み込み、それぞれの画像の表示を切り替えるべきだと思います。また、読み込まれたイメージをスプライトに追加しているようには見えません。 – Neil

+0

2つのオブジェクトが同じ(表示される)親を持ち、可視性が異なる場合、親ディメンションは非表示の子の影響を受けます。 2人の子供が同じサイズを持っている限り、これは問題ではありませんが、そうでなければ、親スプライトの位置付けで多くの "瞬間"の瞬間につながる可能性があります。だから私の答えで私は "可視"のパラメータを切り替えるのではなく、addChildとremoveChildを使用しています。それは隠された依存関係を作成しません。 –

答えて

1

リスナーをそのようにネストしないでください。

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"); 

} 
} 

はこれを試してみてください。

+0

私は同意しません。あなたはあなたが終わったことを知っているときだけ聞いているときに予期しない行動が少なくなります。逆もまた同様です。 –

+0

もう一度あなたに同意します。コードを更新してリスナーを変更するたびに、リスナーをコード内のグループ化された場所(コンストラクターなど)に宣言する場合は、リスナーを1か所で変更するだけで済みます。コードを1か所で更新することを忘れた場合、多くのエラー(予期しない動作)が発生します。リスナーをグループ化することは最高ですが、リスナーを絶えず削除しないでください。 –

+0

ŁukaszZarodaは、ある特定のイベントlisternerのリスナーメソッドが、関数名を持つ代わりに別のイベントリスナーの作成を含んでいるという事実です。ガベージコレクションに影響する可能性があるので、悪い習慣です。 – Neil

関連する問題