SpriteVisualElement不接受鼠标输入

时间:2012-02-03 20:17:07

标签: flex click mouse sprite

我正在尝试使用SpriteVisualElement作为here:

项目渲染器的一个很好的例子

我遇到的问题是,当点击指向没有任何子组件的渲染器区域时,无法检测到鼠标单击事件。例如:如果我点击文本字段,那么它可以工作,我看到鼠标甚至被派遣。如果我单击渲染器上的空白点,则不会调度任何鼠标事件。我已经尝试过mouseEnabled = true(默认情况下都是默认的)没有运气。我从Flex doc:

看到了

click事件是从InteractiveObject继承的。所以这可能与焦点有关(参见页面的页面)。寻找解释为什么InteractiveObject的行为方式。谢谢!

2 个答案:

答案 0 :(得分:1)

发生的事情是您在渲染器中没有任何内容可以点击,因此点击将通过您的渲染器,通过添加和图像或图形来创建可点击区域。
最好的办法是告诉渲染它没有任何mouseChildren,然后它会响应任何点击它。

更改此方法

  public function TweetRenderer()
  {
     this.mouseChildren = false;
     percentWidth = 100;
  }

答案 1 :(得分:1)

我认为现在有点清楚了。 mouseChildren是DisplayObjectContainer上的属性。并且如下面的示例所示,DisplayObjectContainer不会调度任何鼠标单击事件,当点击发生在未被其中任何一个孩子占用的区域上时。这是不直观的,因为DisplayObjectContainer有一个从InteractiveObject继承的click事件,所以如果我点击容器,那么一个(像我这样的newbe)会期望它调度一个事件。设置mouseChildren = false会使DisplayObjectContainer变平,因此将调度任何子项上的click事件,将target作为容器。但!!!这仍然假设您单击子项而不是空白区域。在儿童未拍摄的区域内进行点击时无法发送。此示例显示了这一点:如果单击TextField或填充,则甚至会使用SpriteVisualElement作为目标进行调度。如果单击其他位置,则不会调度该事件。考虑到DisplayObjectContainer上是否存在click事件,我仍然不清楚为什么这是一个预期的行为。也许是因为容器根本不是要检测鼠标点击,而是他们的孩子?这对我来说有点不直观。

<?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>