是否可以在actionscript中设置flex spark的skinclass属性?

时间:2013-12-31 09:45:16

标签: flex actionscript flex-spark

我知道我可以为火花组件设置自定义皮肤。是否可以在actionscript中设置skinClass的属性?这是一个例子:

  1. 自定义按钮,如:

    < view:SparkButton height =“24”icon =“@ Embed('left.gif')”/>

  2. 其skinClass片段:

    < s:Rect id =“border”left =“0”right =“0”top =“0”bottom =“0”width =“69”height =“20”radiusX =“2”>

    <s:stroke>
        <s:LinearGradientStroke rotation="90" weight="1">
            <s:GradientEntry color="0xFFFFFF" alpha="0.5625" alpha.down="0.6375" />
            <s:GradientEntry color="0xFFFFFF" alpha="0.75" alpha.down="0.85" />
        </s:LinearGradientStroke>
    </s:stroke>
    

    &LT; / s的:矩形&GT;

  3. 在使用自定义SparkButton的as文件中,是否可以动态设置或修改边框属性(如s:Rect visible或s:GradientEntry之一的颜色)?比如“SparkButton.border .... visible = false”?或者我可以做的是修改其mxml文件中的skinClass?

1 个答案:

答案 0 :(得分:1)

技术上答案是:是的,您可以访问皮肤的属性。 SkinnableComponent类有一个公共skin property,其中包含对应用于该组件的外观实例的引用。因此,为了直接设置该皮肤实例的属性,您可以执行以下操作:

var skin:MyButtonSkin = myButton.skin as MyButtonSkin;
skin.myProperty = "someValue";

请注意,如果您想要访问UIComponent上尚未存在的自定义属性,则必须进行转换。


然而,这不是一个好方法,因为它创建了我们可以避免的依赖关系。如果有一天我们想在该自定义按钮上使用另一个皮肤,则此代码将会中断。

有很多方法可以更优雅地处理这个问题,但由于你的问题相当广泛(我没有一个具体的例子可以使用),我只是概述一些可能性:

1。使用皮肤状态更新其属性

例如:<s:Rect id="border" visible.down="false" ...>。由于您在此处使用Button,因此已经预定义了一些状态,但您可以通过覆盖自定义Button类中的getCurrentSkinState()来添加自己的状态。

2。使用样式而不是属性

您可以根据需要创建自定义样式。

view|SparkButton {
    backgroundVisible: false;
}

view|SparkButton.withBackground {
    backgroundVisible: true;
}

并在皮肤中使用它:

<s:Rect id="border" visible="{getStyle('backgroundVisible')}" ...>

3。在主机组件上包装属性。

在这种情况下,“主机组件”是您的自定义按钮类。 在其上创建一个属性,例如

[Bindable]
public var backgroundVisible:Boolean;

您现在可以在皮肤上访问此属性,如下所示:

<s:Rect id="border" visible="{hostComponent.backgroundVisible}" ...>

因为我们使属性可绑定,所以只要在Button本身上设置属性,外观就会更新。

请注意,最后一种方法可能是最简单的方法,但需要付出代价:它会在组件及其外观之间创建依赖关系。如果您总是打算将该特定皮肤与该特定组件一起使用,那么这不是什么大问题。但是如果你需要更多的灵活性,最好选择其他两个选项之一。