Как определить иерархию экранных объектов, через которые будет происходить событие? - PullRequest
0 голосов
/ 07 июня 2011

В ActionScript 3 есть ли способ определить точную иерархию экранных объектов, через которую будет проходить событие при отправке из данного объекта? Объект не обязательно является экранным объектом.

Хотя я мог представить, что это действительно полезно, в моем конкретном случае это учебное упражнение. Я пытаюсь освоить систему событий во флэш-памяти, и у меня есть несколько мест, где мне очень интересно, по какому пути пойдет событие, когда я отправлю его.

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Существует абсолютно способ. Flash имеет несколько удобных функций / свойств, которые могут облегчить это.

Поскольку все объекты Flash, которые расширяют ** другой класс, например DisplayObject, имеют родительское свойство, вы можете просто написать:

import "flash.utils.getQualifiedClassName";

var bubblePath:String = "";

var parentObject:* = parent;
while( parentObject ) {
    bubblePath += getQualifiedClassName( parentObject ) + "\n";
    parentObject = parentObject.parent;
}

trace( bubblePath );

Это даст вам строку с именами всех классов. Я не уверен, что это именно то, что вы ищете в своем эксперименте, но при этом не должно быть затруднений при необходимости изменить вывод.

1 голос
/ 07 июня 2011

Ответ вроде.События не ограничиваются DisplayObjects, и когда они запускаются DisplayObjects, они не всегда следуют одному и тому же шаблону. Событие может очень зависеть от того, какой тип DisplayObject и было ли событие инициировано программно (через dispatchEvent) или изначально(щелчком мыши).Это также может варьироваться в зависимости от того, включено ли всплывающее окно или нет, и является ли оно настраиваемым событием.Например, событие завершения Loader не имеет смысла распространяться на родительские объекты, даже если Loader является экранным объектом.

Если вы пытаетесь выяснить родителей объекта, отправившего событие,тогда вы захотите что-то вроде этого:

import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
myDispatcher.addEventListener( MouseEvent.CLICK, clickHandler );

function clickHandler( event:MouseEvent ):void
{
    // event.currentTarget is the object which you're listening to.
    // event.target is the object which actually dispatched the event
    // (if you're listening to a MovieClip and a button inside it is clicked,
    // target will refer to the button, currentTarget the MovieClip)
    var ancestry:Vector.<DisplayObjectContainer> = getAncestry( event.currentTarget as DisplayObject );
    // do somethign with all of the parents.

}

// this function takes a DisplayObject and returns all of its ancestor objects 
// all the way to the root as a Vector.
function getAncestry( obj:DisplayObject ):Vector.<DisplayObjectContainer>
{
    var par:Object = obj.parent;
    var ancestry:Vector.<DisplayObjectContainer> = new Vector.<DisplayObjectContainer>();
    while( par )
    {
        par = par.parent;
        ancestry.push( par as DisplayObject );
        if( par == root ) break;//sometimes the root has a parent.
    }
    return ancestry;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...