impedir o estágio de receber eventos do mouse que ocorrem em outros objetos?

Apesar de ler muitos artigos sobre AS3 e de completar projetos do mundo real, ainda estou muitas vezes perplexo com tarefas simples de gestão de eventos.

num projecto Flex actual, o utilizador é capaz de criar instâncias de uma classe personalizada baseada no contorno, seleccionando-as e mudando-as ou redimensionando-as. Eu gostaria de adicionar um ouvinte de eventos para detectar cliques do mouse que ocorrem em um contorno de fundo (ou o estágio), a fim de deseleccionar qualquer instância atualmente selecionada.

pode alguém delineia os passos para conseguir isso? Eu tentei tudo o que posso pensar (ativar/desativar useCapture, tentando comparar eventos.alvo com evento.currentTarget, trying to test eventPhase).

meu projeto é muito complicado para postar, mas com o caso de teste simples abaixo, eu recebo a seguinte saída e não faz qualquer sentido para mim: o resultado é o mesmo.

então a minha pergunta: Como é que detecto eventos do rato que ocorrem apenas em objectos específicos?

clicando num instância de um container de fronteira personalizado:

----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3

clicando no background directamente:

----------stage click 1
stage is TARGET 1
----------stage click 1
stage is TARGET 1
-----------background click 1
background is currentTarget 1
-----------background click 3
background is currentTarget 3
----------stage click 3
stage is TARGET 3
----------stage click 3
stage is TARGET 3

//-------------------

background.addEventListener(MouseEvent.CLICK, backgroundClick); 
background.addEventListener(MouseEvent.CLICK, backgroundClick, true); 
stage.addEventListener(MouseEvent.CLICK, stageClick); 
stage.addEventListener(MouseEvent.CLICK, stageClick, true);

protected function backgroundClick(event:MouseEvent):void {
    trace("-----------background click", event.eventPhase);  

    if (event.target == background){
        trace("background is TARGET",event.eventPhase);
    }

    if (event.currentTarget == background){
        trace("background is currentTarget",event.eventPhase);
    }
} 

protected function stageClick(event:MouseEvent):void {
    trace("----------stage click",event.eventPhase); 
    if (event.target == stage){
        trace("stage is currentTarget",event.eventPhase);
    }

    if (event.currentTarget == stage){
        trace("stage is TARGET",event.eventPhase);
    }
}
Author: No Grabbing, 2012-10-14

1 answers

Clique na bolha de eventos; isto significa que, a menos que pare a propagação; todos os Componentes da hierarquia, a partir do ponto em que o evento foi enviado até ao palco, receberão o evento click durante a fase de bolha. Adicionar ouvintes de eventos no palco irá pegar cada evento click no aplicativo; como o estágio é o nível superior da hierarquia.

Normalmente você adicionaria ouvintes de eventos a uma instância específica do seu Container de fronteira; não no palco.

Mais informações sobre como os eventos funcionam nos documentos.

 0
Author: JeffryHouser, 2012-10-13 22:15:40