mouseEnabledWhereTransparent 未按预期工作

发布于 2024-10-19 20:10:26 字数 1527 浏览 1 评论 0原文

我只是不明白为什么 mouseEnabledWhereTransparent 不适用于此皮肤。

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

我尝试将另一个组包裹在三角形路径周围,并尝试将其包裹到图形对象中,但也没有成功。我可以创建一个 alpha 值低于所有内容的 矩形,但这不正是 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>

I just cannot understand why mouseEnabledWhereTransparent does not work on this skin.

The Skin this creates is basically a Button with a transparent background and a little triangle to the left side, like so: >ButtonText But the empty space around the Triangle does not receive mouse events.

I've tried wrapping another group around the triangle path and i've tried wrapping it into a Graphic Object, also without success. I could create a Rect with 0 alpha below everything, but isn't that exactly what mouseEnabledWhereTransparent should be doing for me?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

何必那么矫情 2024-10-26 20:10:26

哟,您需要的是在该路径之前添加一个矩形作为点击区域,这可以工作:

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

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

Yo, what you need is to add a rectangle before that path to act as a hit area, this works:

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

This guy here has a good example of making custom buttons (minus the label)

一江春梦 2024-10-26 20:10:26

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

来自 GroupBase.mouseEnabledWhereTransparent 的 ASDoc:

“仅当将鼠标、触摸或 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>

此属性的主要用例是将单击事件直接添加到组,但考虑一下很有趣你提出的案例。按照“如果主机组件附加了鼠标侦听器,在皮肤上设置 mouseEnabledWhereTransparent 应该会产生效果”这样的方式提交增强请求可能是合理的。

mouseEnabledWhereTransparent has no effect if there are no mouse event listeners on the Group it is set on. In your example the Button object has a click event listener, but the Button's skin object (SparkSkin) does not.

From the ASDoc for GroupBase.mouseEnabledWhereTransparent:

"This property only goes in to effect if mouse, touch, or flash player gesture events are added to this instance."

A workaround for you would be to add a mouse event listener to the skin that won't do anything, for example:

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

The main use case for this property has been adding click events directly to a Group, but it is interesting to think about the case you bring up. It might be reasonable to file an enhancement request along the lines of "Setting mouseEnabledWhereTransparent on a skin should have an effect if the hostComponent has mouse listeners attached".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文