2

ステージ全体を上から下までカバーするナビゲーション項目を備えた Web サイトを開発しています (下の変更された画像を参照)。ユーザーがマウスでステージを終了するのは非常に簡単で、MouseEvent.MOUSE_OUT「オフにする」ために必要なイベントをトリガーしません。ナビアイテム。

Event.MOUSE_LEAVEマウスがステージを離れたことを検出し、有効なナビゲーション項目をオフにするために使用する必要がありますか? それが私がやろうとしていたことですが、リスナーからの出力を取得するのに問題がありました。何か案は?

代替テキスト http://marcysutton.com/blog/wp-content/uploads/2010/01/redpropeller.png

Flash IDE のムービークリップに関連付けられたクラスの場合、これはEvent.MOUSE_LEAVEリスナーを登録するための正しい構文ですか? 私が何をしても何もしないようです。イベントを発生させるためにブラウザにムービーを埋め込まなければならない場合はありますか?

this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

ここに私の MainNav.as クラスがあります:

package com.redpropeller {

import com.greensock.*;
import com.greensock.plugins.*;
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class MainNav extends MovieClip { // MainNav is a movieclip in the IDE

    public var colors:Array;

    public function MainNav():void {
        colors = new Array(0xee3124, 0xc72a1f, 0xa62c24, 0x912923, 0x7e221c);
        TweenPlugin.activate([TintPlugin]);

        // trying to target stage through this object
        this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);

        for(var i:Number=0; i<this.numChildren; i++){
            var n = this.getChildAt(i);
            n.useHandCursor = true;
            n.buttonMode = true;

            n.addEventListener(MouseEvent.MOUSE_OVER, navBtnOn);
            n.addEventListener(MouseEvent.MOUSE_OUT, navBtnOff);
        }
    }
    public function mouseLeaveListener(e:Event):void {
        trace('mouseleave'); // nothing ever happens

    }
    private function navBtnOn(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01, {tint:0x333333});
    }
    private function navBtnOff(e:MouseEvent):void {
        TweenLite.to(e.currentTarget.bar_mc, 0.01,
            {tint:uint(colors[this.getChildIndex(MovieClip(e.currentTarget))])});
            // changes color back to specific tint
    }
}

}
4

2 に答える 2

1

回答: Event.MOUSE_LEAVE は IDE では起動しません。ムービーが HTML ページに埋め込まれている場合は問題なく動作します。ご協力いただきありがとうございます!

于 2010-01-06T00:49:08.083 に答える
0

コンストラクターで MOUSE_LEAVE のイベントリスナーを作成しようとしています。MainNav が addChild() メソッドによってステージに追加されていない場合、ステージ オブジェクトがまだ存在しない可能性があります。設計時に MainNav が既にステージ上にある場合でも、そのステージがすぐに利用できない可能性があります。DisplayObject から継承するクラス (MovieClip、Sprite など) の場合、コンストラクターで行うことは 1 つだけです。それは、Event.ADDED_TO_STAGE リスナーをセットアップすることです。オブジェクトが親コンテナーから addChild() を介してステージの表示スタックに追加された場合、またはオブジェクトが設計時に既にステージ上にある場合、そのリスナーは init() メソッドをトリガーします。init() メソッドが呼び出されると、stage プロパティが使用可能になることがわかります。

コンストラクターでは、インスタンスにまだステージが存在しない可能性がありますが、実行時エラーが発生するはずです。ただし、ステージの前に「this」キーワードを使用しています。オブジェクトから継承するクラスで 'this' を使用する場合 (クラスは MovieClip->DisplayObject->EventDispatcher->Object を介して行います)、プロパティが存在しなくても、コンパイラはそれを作成しようとするため、エラーをスローしません。 「this」のメンバーとしてのプロパティ。これは、Object クラスが動的であるために発生します。つまり、ヘッダーでクラス変数として宣言する必要なく、いつでも新しいプロパティを作成できます。その動的プロパティを使用するときは、'this' キーワードを使用するだけです。this.stage を使用する場合、stage が存在しない場合、クラスはプロパティ stage を作成します。しかし、これはあなたが望むステージではなく、そのため、リスナーは何もしない空のオブジェクトにアタッチされています。ステージを参照するときに「this」を削除してみてください。いつかエラーが表示されるはずです。一般に、コンパイラはそのプロパティの型エラーを無視するため、プロパティに 'this' を使用することはお勧めできません。

上記の 1 つのコメントで、MOUSE_LEAVE は IDE では機能しないと述べていますが、CS4 からこれをテストしたところ、機能します。ブラウザの Flash Player プラグインと比較して、IDE の Flash Player とのパフォーマンスの違いを目にしているかもしれません。場合によっては、SWF がすばやく読み込まれ、ステージがすぐに使用可能になると、ステージ イベント リスナーがコンストラクターから機能しますが、信頼性は高くありません。そのリスナーを、ADDED_TO_STAGE イベントの後に呼び出される init() メソッドに移動し、「this」キーワードを使用しないでください。

于 2010-01-12T16:29:57.307 に答える