【问题标题】:SpriteVisualElement doesn't take mouse inputSpriteVisualElement 不接受鼠标输入
【发布时间】:2016-02-28 18:40:12
【问题描述】:

我正在尝试使用一个很好的示例,将 SpriteVisualElement 用于来自 here: 的项目渲染器

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

click 事件继承自 InteractiveObject。因此,这可能与焦点有关(请参阅页面的和处的胎面)。寻找解释为什么 InteractiveObject 会这样。谢谢!

【问题讨论】:

  • 我刚刚发现如果我用这样的颜色填充 SpriteVisualElement:this.graphics.beginFill(0xffffff,0); this.graphics.drawRect(0, 0, 200, 40); this.graphics.endFill();然后填充区域采用鼠标输入。不过,我仍然不明白这种行为的想法。

标签: apache-flex click mouse sprite


【解决方案1】:

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

改变这个方法

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

【讨论】:

  • 感谢 asMan,尝试了您的建议,但仍然是相同的行为。
  • 啊抱歉,我只是简单地看了一下代码,因为它似乎是一个集群。我认为 TweetRenderer 将是放置它的地方。我现在没有时间看它,但这应该是你需要的修复。你只需要找到被放置它。
【解决方案2】:

我想现在有点清楚了。 mouseChildren 是 DisplayObjectContainer 上的一个属性。如以下示例所示,当在其任何子项未占用的区域上发生单击时,DisplayObjectContainer 不会调度任何鼠标单击事件。这是不直观的,因为 DisplayObjectContainer 有一个从 InteractiveObject 继承的单击事件,所以一个(像我这样的新手)会希望它在我单击容器时调度一个事件。设置 mouseChildren=false 会使 DisplayObjectContainer 变平,因此任何子级上的单击事件都将被调度,并将目标作为容器。但!!!这仍然假设您单击孩子,而不是空白区域。当在孩子没有采取的区域内完成点击时,无法调度它。此示例显示:如果单击 TextField 或填充,则甚至会以 SpriteVisualElement 作为目标进行调度。如果您单击其他地方,则不会调度该事件。考虑到 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2011-02-07
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多