Flex: динамически нарисованная группа с событиями мыши - PullRequest
1 голос
/ 14 марта 2012

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

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

<?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, Группуне пропадай, когда я добавлю это событие.Но теперь мне любопытно узнать причину такого поведения.

Ответы [ 2 ]

1 голос
/ 22 марта 2013

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

1 голос
/ 15 марта 2012

Это довольно интересно, по какой-то причине добавление слушателя вызывает вызов 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:
...