为什么默认的spark按钮皮肤没有iconDisplay标签?

时间:2014-06-17 10:07:29

标签: actionscript-3 flex flex-spark skins

对于Flex 4.6按钮,可以定义标签和图标:

<s:Button icon="{@Embed('assets/icon.png'}" label="Do the dance" />

corrseponding皮肤部分是:iconDisplay:BitmapImagelabelDisplay:IDisplayText,它们由组件(adobe ref)设置。它们在ButtonBase.as

中定义

spark.components.supportClasses.ButtonBase

//--------------------------------------------------------------------------
//
//  Skin parts
//
//--------------------------------------------------------------------------

[SkinPart(required="false")]

/**
 *  A skin part that defines an optional icon for the button. 
 *  
 *  @langversion 3.0
 *  @playerversion Flash 10.1
 *  @playerversion AIR 2.0
 *  @productversion Flex 4.5
 */
public var iconDisplay:BitmapImage;

[SkinPart(required="false")]

/**
 *  A skin part that defines the label of the button. 
 *  
 *  @langversion 3.0
 *  @playerversion Flash 10
 *  @playerversion AIR 1.5
 *  @productversion Flex 4
 */
public var labelDisplay:IDisplayText;

spark.components.Button 扩展 ButtonBase 并添加一些新样式和_emphasized属性,但没有提及有关iconDisplay的任何内容。所以在我看来,实际绘制按钮的唯一类是皮肤类。如果我们去 spark.skins.spark.ButtonSkin 这是Flex使用的默认外观(或者是?),我们会发现:

<!-- layer 8: text -->
    <!--- @copy spark.components.supportClasses.ButtonBase#labelDisplay  -->
    <s:Label id="labelDisplay"
             textAlign="center"
             maxDisplayedLines="1"
             horizontalCenter="0" verticalCenter="1" verticalAlign="middle"
             left="10" right="10" top="2" bottom="2">
    </s:Label>

以便可以显示标签,但是皮肤没有<s:BitmapImage id="iconDisplay">因此我不明白当没有容器显示时图标是如何显示的?

1 个答案:

答案 0 :(得分:9)

这是因为ButtonSkin扩展了SparkButtonSkin,其iconDisplay放在iconGroup中并与constructIconParts()一起显示。由于扩展类的mxml语法(使用<s:SparkButtonSkin>作为ButtonSkin.mxml的根节点),因此不是很清楚。

在按钮中显示可缩放的FXG图标也很棒: http://hulstkamp.com/articles/flex-advanced-fxg-spark-icon-buttons/