Вопрос

Я разрабатываю веб-сайт с элементами навигации, которые охватывают всю сцену сверху донизу (см. Измененное изображение ниже), и пользователю довольно легко выйти со сцены с помощью мыши, не запуская MouseEvent.MOUSE_OUT события, необходимые для "отключения" указанных элементов навигации.

Должен ли я использовать Event.MOUSE_LEAVE чтобы определить, когда мышь покинула сцену, и отключить все включенные элементы навигации?Это то, что я пытался сделать, но у меня возникли проблемы с получением каких-либо выходных данных от моего слушателя.Есть какие-нибудь идеи?

альтернативный текст http://marcysutton.com/blog/wp-content/uploads/2010/01/redpropeller.png

Для класса, связанного с movieclip во Flash IDE, является ли это правильным синтаксисом для регистрации Event.MOUSE_LEAVE слушатель?Кажется, что это ничего не дает, независимо от того, что я делаю.Это тот случай, когда мне нужно встроить фильм в браузер, чтобы событие сработало?

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

Вот мой MainNav.класс:

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

}
Это было полезно?

Решение

Вы пытаетесь создать прослушиватель событий для MOUSE_LEAVE в конструкторе.Возможно, что объект stage еще не существует, если mainNav не был добавлен в stage с помощью метода addChild().Если mainNav уже находится на стадии разработки, все еще возможно, что эта стадия не будет доступна немедленно.Для классов, которые наследуются от DisplayObject (MovieClip, Sprite и т.д.), я делаю только одну вещь в конструкторе:настройте событие.ДОБАВЛЕН ПРОСЛУШИВАТЕЛЬ_TO_STAGE.Этот прослушиватель запускает метод init(), когда объект был добавлен в стек отображения сцены с помощью addChild() из родительского контейнера, или если объект уже находится на сцене во время разработки.Когда вызывается мой метод init(), я знаю, что свойство stage будет доступно.

В вашем конструкторе stage может еще не существовать в экземпляре, но вы должны получить сообщение об ошибке времени выполнения.Однако вы используете ключевое слово "this" заранее.Когда вы используете 'this' в классе, который наследуется от Object (ваш класс наследует через MovieClip->DisplayObject->EventDispatcher->Object), компилятор не выдаст ошибку, если свойство не существует, потому что он пытается создать это свойство как член 'this'.Это происходит потому, что класс Object является динамическим, а это означает, что новые свойства могут быть созданы в любое время без необходимости объявлять их как переменные класса в заголовке - вам просто нужно использовать ключевое слово 'this' при использовании этого динамического свойства.Когда вы используете this.stage, если stage не существует, класс создает для вас свойство stage.Однако это не та стадия, которая вам нужна, поэтому слушатель просто привязывается к пустому объекту, который ничего не делает.Попробуйте удалить "this" при ссылке на stage, и я уверен, что в какой-то момент вы увидите ошибку.В общем, не рекомендуется использовать 'this' для свойств, поскольку компилятор будет игнорировать ошибки типа для этого свойства.

Вы упомянули в одном комментарии выше, что MOUSE_LEAVE не работает в IDE, но я протестировал это из CS4, и это действительно работает.Возможно, вы наблюдаете разницу в производительности Flash Player от IDE по сравнению с плагином Flash Player для браузера.В некоторых случаях ваш прослушиватель событий stage будет работать из конструктора, если SWF загружается быстро и stage доступен немедленно, но это ненадежно.Переместите этот прослушиватель в метод init(), который вызывается после события ADDED_TO_STAGE, и не используйте ключевое слово 'this'.

Другие советы

Ответ:Событие.MOUSE_LEAVE не запускается в IDE.Это прекрасно работает, когда фильм встроен в HTML-страницу.Спасибо за вашу помощь!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top