我知道我可以为火花组件设置自定义皮肤。是否可以在actionscript中设置skinClass的属性?这是一个例子:
自定义按钮,如:
< view:SparkButton height =“24”icon =“@ Embed('left.gif')”/>
其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;
在使用自定义SparkButton的as文件中,是否可以动态设置或修改边框属性(如s:Rect visible或s:GradientEntry之一的颜色)?比如“SparkButton.border .... visible = false”?或者我可以做的是修改其mxml文件中的skinClass?
答案 0 :(得分:1)
技术上答案是:是的,您可以访问皮肤的属性。 SkinnableComponent
类有一个公共skin property,其中包含对应用于该组件的外观实例的引用。因此,为了直接设置该皮肤实例的属性,您可以执行以下操作:
var skin:MyButtonSkin = myButton.skin as MyButtonSkin;
skin.myProperty = "someValue";
请注意,如果您想要访问UIComponent
上尚未存在的自定义属性,则必须进行转换。
然而,这不是一个好方法,因为它创建了我们可以避免的依赖关系。如果有一天我们想在该自定义按钮上使用另一个皮肤,则此代码将会中断。
有很多方法可以更优雅地处理这个问题,但由于你的问题相当广泛(我没有一个具体的例子可以使用),我只是概述一些可能性:
例如:<s:Rect id="border" visible.down="false" ...>
。由于您在此处使用Button,因此已经预定义了一些状态,但您可以通过覆盖自定义Button类中的getCurrentSkinState()来添加自己的状态。
您可以根据需要创建自定义样式。
view|SparkButton {
backgroundVisible: false;
}
view|SparkButton.withBackground {
backgroundVisible: true;
}
并在皮肤中使用它:
<s:Rect id="border" visible="{getStyle('backgroundVisible')}" ...>
在这种情况下,“主机组件”是您的自定义按钮类。 在其上创建一个属性,例如
[Bindable]
public var backgroundVisible:Boolean;
您现在可以在皮肤上访问此属性,如下所示:
<s:Rect id="border" visible="{hostComponent.backgroundVisible}" ...>
因为我们使属性可绑定,所以只要在Button本身上设置属性,外观就会更新。
请注意,最后一种方法可能是最简单的方法,但需要付出代价:它会在组件及其外观之间创建依赖关系。如果您总是打算将该特定皮肤与该特定组件一起使用,那么这不是什么大问题。但是如果你需要更多的灵活性,最好选择其他两个选项之一。