2012-03-14 6 views
1

У меня есть группа в моем представлении, и я пытаюсь заполнить ее каким-то collor и добавить событие мыши, все динамически. проблема заключается в том, что когда я добавляю событие мыши, группа просто снова становится невидимой. Он по-прежнему существует в представлении и реагирует нормально на события мыши, но я не могу видеть, что этоFlex: динамически нарисованная группа, с событиями мыши

вот пример кода:

<?xml version="1.0" encoding="utf-8"?> 
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView" creationComplete="onCreationComplete()" > 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 

    <fx:Script> 
     <![CDATA[ 

       public function onCreationComplete():void 
       { 
        testeGroup.graphics.beginFill(0xff0000); 
        testeGroup.graphics.drawRect(0, 0, testeGroup.width, testeGroup.height); 
        testeGroup.graphics.endFill(); 

        testeGroup.addEventListener(MouseEvent.CLICK, function():void{ 
         trace("test"); 
        }); 
       } 

     ]]> 
    </fx:Script> 

    <s:Group id="testeGroup" verticalCenter="0" horizontalCenter="0" width="100" height="100" > 

    </s:Group> 

</s:View> 

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

Я действительно решил свою проблему, используя свойство opaqueBackground, группа не исчезает, когда я добавляю событие this whay. Но теперь мне интересно узнать о причине такого поведения.

ответ

1

Это интересно, по какой-либо причине добавление слушателя вызывает вызов invalidateDisplayList, это означает, что во время следующего ввода фрейма updateDisplayList вызывается, в группе updateDisplayList он вызывает вызов graphics.clear(), он также вызывает drawBackground(), который выполняет graphics.clear(). В принципе, рисование на объектной графике извне, как это имеет тенденцию создавать подобные виды странного поведения, я думаю, что лучше расширить группу, а затем сделать свой рисунок в updateDisplayList.

Чтобы быть немного более конкретный код addEventListener в GroupBase задает свойство hasMouseListeners и в инкубаторе там он аннулирует списка отображения, список событий, это будет происходить за здесь:

 case MouseEvent.CLICK: 
     case MouseEvent.DOUBLE_CLICK: 
     case MouseEvent.MOUSE_DOWN: 
     case MouseEvent.MOUSE_MOVE: 
     case MouseEvent.MOUSE_OVER: 
     case MouseEvent.MOUSE_OUT: 
     case MouseEvent.ROLL_OUT: 
     case MouseEvent.ROLL_OVER: 
     case MouseEvent.MOUSE_UP: 
     case MouseEvent.MOUSE_WHEEL: 
     case TouchEvent.TOUCH_BEGIN: 
     case TouchEvent.TOUCH_END: 
     case TouchEvent.TOUCH_MOVE: 
     case TouchEvent.TOUCH_OUT: 
     case TouchEvent.TOUCH_OVER: 
     case TouchEvent.TOUCH_ROLL_OUT: 
     case TouchEvent.TOUCH_ROLL_OVER: 
     case TouchEvent.TOUCH_TAP: 
     case GestureEvent.GESTURE_TWO_FINGER_TAP: 
     case PressAndTapGestureEvent.GESTURE_PRESS_AND_TAP: 
     case TransformGestureEvent.GESTURE_PAN: 
     case TransformGestureEvent.GESTURE_ROTATE: 
     case TransformGestureEvent.GESTURE_SWIPE: 
     case TransformGestureEvent.GESTURE_ZOOM: 
1

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

<s:Group 
    id="doNotUseMyGraphicsBecauseItWillNotWork" 
    > 
    <s:Graphic 
     id="useMyGraphicsInstead" 
     /> 
</s:Group>