2012-04-25 2 views
0

Долгое время читатель, первый раз плакат :).Объект Flex 4, возвращающийся как объект MovieClip

Я работаю над настраиваемым контекстным меню в Flex4. Контекстное меню само по себе прекрасно работает, но я ищу способ определить, является ли ContextMenuEvent mouseTarget образ. Как показано на рисунке, mouseTarget показывает, что это «[объект MovieClip]». Это странно, потому что в моем приложении нет клипов, а только контейнеры изображений. Любая идея, что происходит?

private function openContextMenu(e:ContextMenuEvent):void { 
    Alert.show(e.mouseTarget.toString());// shows [object MovieClip] when it should show [Object Image] 
} 

Благодаря

+0

Ваши изображения контейнеры MovieClips или они Загрузчик объекты? – Corey

+0

Контейнеры для изображений: . Позже я добавлю свойство «source» на основе данных, загруженных из операции загрузки. Fileload. – Dom

+0

Вам, вероятно, нужно будет углубиться в MovieClip, чтобы увидеть, является ли это дочерним элементом изображения и т. Д. Класс Image расширяет множество объектов, менее всего может быть растровое изображение, которое показано на рисунке. Возможно, вам захочется изучить класс BitmapImage в Flex, который может обеспечить более прямой путь к тому, что вы хотите. – NHubben

ответ

0

Вы должны установить mouseChildren на изображение, чтобы ложно, то MouseEvent будет ссылаться на изображения:

if (event.target is Image) { 
    //do stuff 
} 
+0

Это было прекрасно. Непонимание моего быстрого чтения mouseChildren в документах, которые я пробовал, и отказался от этого, когда он не работал. Таким образом, mouseChildren = false на теге изображения было решением. Вероятно, сохраненный milisecond из моего решения, а также немного памяти и несколько строк кода. Благодаря! – Dom

0

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

for(var i:int = 0; i < getObjectsUnderPoint(new Point(this.mouseX, this.mouseY)).length; i++) 
{ 
    if(getObjectsUnderPoint(new Point(this.mouseX, this.mouseY))[i].parent.parent is Image) 
    { 
     //do what I need to do 
    } 
} 

Благодаря NHubben для входа. Это привело меня к правильному пути взгляда на детей.

+1

Это не общее решение, и оно сломается, если вам случится сменить контейнер или ребенка. – iND

0

Наименование компонента Image не имеет отношения к тому, что его заводит. Наследование flex: Image - SWFLoader - UIComponent - FlexSprite - [...] (от mx.controls.Image docs).

Так что вам нужно понять, что вы на самом деле имеете, когда приносите его в среду AS3. Кажется, он обернут в MovieClip, чтобы он был включен в список отображения Flash. Также похоже, что вам нужно пройти через загрузчика, но я не уверен в этом.

Выполните тест или два, чтобы выяснить, что объект на самом деле состоит из:

// not foolproof, and will break on some stuff, 
// so you will have to fix this as needed: 
private function loopDisplay(obj:Sprite):void 
{ 
    trace(obj.name + ": " + obj); 
    if (obj.numChildren > 0) 
    { 
     for (var i:int = 0; i < this.numChildren; i++) 
     { 
      loopDisplay(obj.getChildAt(i)); 
     } 
    } 
} 

Если поместить это в обработчике мыши вниз, то вы можете увидеть, что там на самом деле.

Однако event.target или event.currentTarget также должен содержать объект элемента меню, поэтому вы также можете просто вставить их в эти объекты и посмотреть, что в них находится.

Смежные вопросы