Pergunta

Estou desenvolvendo um site com itens nav que cobrem toda a fase de cima para baixo (ver imagem alterada abaixo) e é muito fácil para o usuário a sair do palco com o mouse, não provocando os eventos MouseEvent.MOUSE_OUT necessários para " desligar", disse itens nav.

Eu deveria estar usando Event.MOUSE_LEAVE para detectar quando o rato deixou o palco, e desligar qualquer habilitado itens nav? Isso é o que eu estava tentando fazer, mas tiveram problemas para receber qualquer saída do meu ouvinte. Alguma idéia?

alt texto http://marcysutton.com/blog /wp-content/uploads/2010/01/redpropeller.png

Para uma classe associada a um clipe de filme no Flash IDE, esta é a sintaxe correta para registrar um ouvinte Event.MOUSE_LEAVE? Não parece fazer qualquer coisa, não importa o que eu faço. É um caso em que eu tenho que inserir o filme em um navegador para o evento de fogo?

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

Aqui está minha classe 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
    }
}

}
Foi útil?

Solução

Você está tentando criar o ouvinte de evento para MOUSE_LEAVE no construtor. É possível que o objecto fase não existe ainda se MainNav não foi adicionado à fase através de um método addChild (). Se MainNav já está no palco em tempo de design, ainda é possível que estágio não estará disponível imediatamente. Para as classes que herdam a DisplayObject (MovieClip, Sprite, etc.), I fazer apenas uma coisa no construtor: configurar um ouvinte Event.ADDED_TO_STAGE. Ouvinte que desencadeia um método Init (), quando o objecto foi adicionado à pilha de exibição do estágio através addChild () a partir de um contentor principal, ou se o objecto já estiver na fase no momento da concepção. Quando o meu método init () é chamado, eu sei que a propriedade fase estarão disponíveis.

Em seu construtor, o estágio pode não existir no caso ainda, mas você deve obter um erro de execução. No entanto, você está usando o 'presente' à frente de palavras-chave de palco. Quando você usa 'this' em uma classe que herda de objeto (sua classe faz via MovieClip-> DisplayObject-> EventDispatcher-> Object), o compilador não irá lançar um erro se a propriedade não existe porque ele tenta criar essa propriedade como um membro do 'isto'. Isso acontece porque a classe de objeto é dinâmico, o que significa que novas propriedades podem ser criadas a qualquer momento sem ter que declará-los como variáveis ??de classe no cabeçalho - você apenas tem que usar o 'isto' palavra-chave quando se utiliza essa propriedade dinâmica. Quando você usa this.stage, se estágio não existe a classe cria o estágio de propriedade para você. No entanto, este não é o estágio que você quer, de modo que o ouvinte é apenas ficar ligado a um objeto vazio que não faz nada. Tente remover 'isto' ao fazer referência palco e eu tenho certeza que você vai ver o erro em algum ponto. Em geral, não é uma boa prática para uso 'isto' para as propriedades, uma vez que o compilador irá ignorar erros de tipo para essa propriedade.

Você mencionou em um comentário anterior que MOUSE_LEAVE não trabalho no IDE, mas eu testei isso CS4 e ela não funciona. Você pode estar testemunhando uma diferença de desempenho do Flash Player do IDE em comparação com plug-in Flash Player do navegador. Em alguns casos, o seu estágio evento ouvinte vai trabalhar a partir do construtor se as cargas SWF rapidamente e estágio está disponível imediatamente, mas não é confiável. Mova esse ouvinte a um método init () que é chamado após o evento ADDED_TO_STAGE e não utilize o 'this' palavra-chave.

Outras dicas

Resposta: Event.MOUSE_LEAVE não dispara no IDE. Ele funciona muito bem quando o filme é incorporado em uma página HTML. Obrigado pela sua ajuda!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top