mouseEnabledWhereTransparent无法按预期工作

时间:2011-02-28 13:56:31

标签: flex transparency mouseevent

我只是无法理解为什么mouseEnabledWhereTransparent不能在这个皮肤上工作。

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

我尝试在三角形路径周围包裹另一个组,我尝试将其包装成图形对象,但也没有成功。我可以在所有内容下创建一个0字母的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>

2 个答案:

答案 0 :(得分:1)

哟,你需要的是在该路径之前添加一个矩形作为命中区域,这有效:

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

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

答案 1 :(得分:0)

如果在设置的组上没有鼠标事件侦听器,则mouseEnabledWhereTransparent无效。在您的示例中,Button对象具有单击事件侦听器,但Button的外观对象(SparkSkin)没有。

来自ASDoc for GroupBase.mouseEnabledWhereTransparent:

“只有将鼠标,触摸或Flash播放器手势事件添加到此实例时,此属性才会生效。”

您的解决方法是将鼠标事件侦听器添加到不会执行任何操作的外观,例如:

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

此属性的主要用例是将点击事件直接添加到组中,但考虑您提出的案例很有意思。根据“如果hostComponent附加了鼠标侦听器,在皮肤上设置mouseEnabledWhereTransparent应该有效”,提交增强请求可能是合理的。