我正在尝试使用SpriteVisualElement作为here:
项目渲染器的一个很好的例子我遇到的问题是,当点击指向没有任何子组件的渲染器区域时,无法检测到鼠标单击事件。例如:如果我点击文本字段,那么它可以工作,我看到鼠标甚至被派遣。如果我单击渲染器上的空白点,则不会调度任何鼠标事件。我已经尝试过mouseEnabled = true(默认情况下都是默认的)没有运气。我从Flex doc:
看到了click事件是从InteractiveObject继承的。所以这可能与焦点有关(参见页面的页面)。寻找解释为什么InteractiveObject的行为方式。谢谢!
答案 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>