SpriteVisualElement не принимает ввод мыши - PullRequest
1 голос
/ 04 февраля 2012

Я пытаюсь использовать один замечательный пример использования SpriteVisualElement для средств визуализации элементов из здесь:

У меня есть проблема: невозможнообнаруживать событие щелчка мыши, когда щелчок указывает на область рендерера, у которой нет дочерних компонентов .Например: если я нажимаю на текстовое поле, то оно работает, и я вижу, что мышь даже отправлена.Если я нажимаю на пустое место в рендере, событие мыши не отправляется.Я попытался mouseEnabled = true (который по умолчанию в любом случае true) безуспешно.Я вижу из Flex doc:

событие click унаследовано от InteractiveObject.Так что, возможно, это как-то связано с фокусом (см. Шаг и на странице).Ищите объяснение, почему InteractiveObject ведет себя так.Спасибо!

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Я думаю, теперь становится немного яснее. MouseChildren является свойством DisplayObjectContainer. И, как показано в следующем примере, DisplayObjectContainer не отправляет никаких событий щелчка мышью, когда щелчок происходит в области, которая не занята ни одним из его дочерних элементов. Это не интуитивно понятно, потому что DisplayObjectContainer имеет событие click, унаследованное от InteractiveObject, поэтому один (новичок вроде меня) будет ожидать, что он отправит событие, если я нажму на контейнер. Установка типа mouseChildren = false выравнивает DisplayObjectContainer, поэтому будет отправлено событие click для любого из дочерних элементов, имеющего target в качестве контейнера. Но!!! Это по-прежнему предполагает, что вы нажимаете на ребенка, а не на пустую область. Нет способа отправить его, когда щелчок сделан внутри области, которая не захвачена ребенком. Этот пример показывает это: если вы щелкнете либо по TextField, либо по заливке, то даже отправляется с SpriteVisualElement в качестве цели. Если вы щелкнете в другом месте, событие не будет отправлено. Мне все еще неясно, почему это предполагаемое поведение, принимая во внимание наличие события click на DisplayObjectContainer. Может быть, потому, что контейнеры вовсе не предназначены для обнаружения щелчков мышью, а их дети? Это немного не понятно для меня.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               creationComplete="creationCompleteHandler(event)" >
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function creationCompleteHandler(event:FlexEvent):void {
                var tf:TextField = new TextField();
                tf.text = "I'm inside SpriteVisualElement!";
                tf.background = true;
                tf.backgroundColor = 0xff0000;
                tf.alpha = 0.75;
                tf.selectable = false;
                tf.width = 150;
                tf.height = 25;
                uic.addChild(tf);
                uic.addEventListener(MouseEvent.CLICK, clickHandler);
                uic.mouseChildren = false;
                uic.mouseEnabled = true;

                uic.graphics.lineStyle(1, 0xFF0000);
                uic.graphics.moveTo(0,0);
                uic.graphics.lineTo(uic.width,0);
                uic.graphics.lineTo(uic.width,uic.height);
                uic.graphics.lineTo(0,uic.height);
                uic.graphics.lineTo(0,0);  

                uic.graphics.beginFill(0x00FF00,1);
                uic.graphics.drawRect(12, 12, 178, 28); 
                uic.graphics.endFill(); 

            }

            protected function clickHandler(e:MouseEvent):void {
                trace("click detected, target:",e.target);
            }

        ]]>
    </fx:Script>
    <s:SpriteVisualElement id="uic" horizontalCenter="0" verticalCenter="0" width="200" height="50" />
</s:Application>
1 голос
/ 04 февраля 2012

Что происходит, так это то, что в рендере нет ничего, на что можно было бы кликнуть, поэтому клик провалится через ваш рендерер, добавляя изображение или изображение, которое вы создаете в интерактивной области.Лучше всего сказать рендеру, что у него нет mouseChildren, что заставит его реагировать на любой щелчок по нему.

изменить этот метод

  public function TweetRenderer()
  {
     this.mouseChildren = false;
     percentWidth = 100;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...