mouseEnabledWhereTransparent不按预期工作

问题描述:

我只是不明白为什么mouseEnabledWhereTransparent不适用于此皮肤。mouseEnabledWhereTransparent不按预期工作

创建的皮肤基本上是一个带有透明背景和左侧的小三角形的按钮,如下所示:> ButtonText但Triangle周围的空白空间不会接收鼠标事件。

我试过围绕三角形路径包裹另一组,并试图将它包装到一个图形对象中,也没有成功。我可以在任何地方创建一个带0 alpha的Rect,但不是那个mouseEnabledWhereTransparent应该为我做什么?

<?xml version="1.0" encoding="utf-8"?> 
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:fb="http://ns.adobe.com/flashbuilder/2009" minWidth="21" minHeight="21" alpha.disabled="0.5" 
      mouseEnabledWhereTransparent="true"> 

    <!-- host component --> 
    <fx:Metadata> 
     <![CDATA[ 
     [HostComponent("spark.components.Button")] 
     ]]> 
    </fx:Metadata> 

    <!-- states --> 
    <s:states> 
     <s:State name="up" /> 
     <s:State name="over" /> 
     <s:State name="down" /> 
     <s:State name="disabled" /> 
    </s:states> 

    <!-- triangle tip --> 
    <s:Path data="M 0 0 L 0 14 L 10 7 L 0 0" bottom="5"> 
     <s:fill> 
      <s:SolidColor color="0xFFFFFF" /> 
     </s:fill> 
    </s:Path> 


    <!-- text --> 
    <s:Label id="labelDisplay" 
       textAlign="center" 
       verticalAlign="bottom" 
       maxDisplayedLines="1" 
       left="14" right="10" top="2" bottom="2" color="0x000000" fontSize="14"> 
    </s:Label> 
</s:SparkSkin> 
+0

您是否运行了以下答案? – Ryan 2011-03-02 18:06:26

+0

好吧,如果它有mouseEnabledWhereTransparent = true,那么完全空的组将响应不可见区域上的mouseEvents。当mouseEnabledWhereTransparent = true时,SparkSkin将不会响应不可见区域上的mouseEvents。 SparkSkin是Group的一个子类。我不明白。 – iddqd 2011-03-02 21:35:41

哟,你需要的是添加一个矩形之前路径作为点击区域行动,这个工程:

<s:Rect left="0" right="0" top="0" bottom="0" > 
    <s:fill> 
     <s:SolidColor alpha="0" /> 
    </s:fill> 
</s:Rect> 

这家伙here有制作自定义按钮的一个很好的例子(减标签)

+0

布赖恩你的解决方案的作品,但它仍然让我想知道,为什么我必须添加一个不可见的矩形有一个命中区域。但我不必为这个空组添加一个不可见的矩形:。即使它是空的,该组也会对点击作出响应。为什么不皮肤?这不是什么大问题,但似乎mouseEnabledWhereTransparent不一致。 – iddqd 2011-03-02 21:29:52

+0

当我绘制一个没有涉及组/矩形的路径时,我会想到,路径的边界是该组件的边界。它不是三角形(>)路径周围的区域是透明的,只是除了舞台之外没有任何东西可以点击! – Ryan 2011-03-03 10:02:12

如果在设置的组上没有鼠标事件侦听器,mouseEnabledWhereTransparent无效。在你的例子中,Button对象有一个点击事件监听器,但Button的皮肤对象(SparkSkin)没有。

从ASDoc的为GroupBase.mouseEnabledWhereTransparent:

“此属性只有在那张如果鼠标,触摸,或Flash Player的手势事件被添加到这个实例效应”

一种解决方法,你将鼠标事件侦听器添加到什么都不会做的皮肤,例如:

<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
      mouseEnabledWhereTransparent="true" click="doNothing()"> 
    <fx:Script> 
     <![CDATA[ 
      protected function doNothing():void { 
       trace('doNothing'); 
      } 
     ]]> 
    </fx:Script> 
    ... 
</s:SparkSkin> 

主要用例该物业已被直接添加点击事件一个集团,但想想你提出的案例很有意思。按照“在皮肤上设置mouseEnabledWhereTransparent时,如果hostComponent附加了鼠标侦听器,应该会产生效果”这一行提交增强请求可能是合理的。

+0

嗯,但你通常不会在按钮外观中添加点击监听器。 Spark皮肤的全部重点是将逻辑从UI分离出来,将点击监听器添加到实际的按钮上。 – iddqd 2011-03-02 21:27:11

+0

是的,你是对的,你不应该在皮肤中添加该听众。如果你真的希望mouseEnabledWhereTransparent属性能够工作,我只是提到它是一种解决方法。正确的做法是不在皮肤中使用mouseEnabledWhereTransparent,而是绘制透明的Rect。 – 2011-03-03 06:33:57

+0

所以我们可以说,如果在皮肤中使用它,mouseEnabledWhereTransparent不起作用?如果是,为什么?以此为例:http://forums.adobe.com/thread/710351无论您启用还是禁用mouseEnabledWhereTransparent,CustomButtonSkin.mxml代码的行为都完全相同。 – iddqd 2011-03-06 10:27:10