【问题标题】:Is there a way to add a flex skin programmatically in ActionScript?有没有办法在 ActionScript 中以编程方式添加 flex 皮肤?
【发布时间】:2011-09-02 18:34:46
【问题描述】:

我有各种通过程序化皮肤进行皮肤设计的组件。皮肤类引用了一个单例类,该类包含要应用于组件不同方面的各种颜色。单例类的默认颜色设置为黑色/灰色等变体。我从 XML 文件加载自定义颜色,然后将其加载到单例中。我正在通过包含在主应用程序 mxml 中的 css 样式表应用自定义皮肤。

问题是当 swf 最初加载时,在屏幕上绘制的组件是黑色的,并且不反映从 XML 文件加载的颜色变化。我有一些下拉窗口显示在按钮单击上,这些下拉窗口确实反映了 XML 文件中的正确颜色。因此,系统工作正常,但组件的初始绘制显然发生在 XML 加载并应用于单例之前。

我的问题是,有没有办法通过调用构造函数以编程方式将皮肤应用于元素?

我的 css 文件中有这个:

.PanControlsBackground {
    borderSkin:ClassReference('skins.buttons.PanControlsBackground');
}

我正在应用这个类:

_app.panControls.styleName = "PanControlsBackground";

有没有办法调用:

_app.panControls.styleName = new PanControlsBackground();

或类似的东西?这样,我可以在 css 文件中删除皮肤的加载并控制它们何时被实例化,以确保在显示各种组件之前应用正确的颜色。

【问题讨论】:

    标签: actionscript-3 apache-flex flex4


    【解决方案1】:

    您可以使用styleManager 在运行时操作样式。例如,

    .PanControlsBackground {
      /* leave it blank */
    }
    

    然后在某个脚本块中:

    styleManager.getStyleDeclaration(".PanControlsBackground").setStyle("borderSkin", skins.buttons.PanControlsBackground);
    

    所以,这是以编程方式更改皮肤的一种方式。

    但是,我不太了解旧皮肤上的垃圾收集是如何处理的。例如,GC 在这种切换皮肤的方法上与仅仅为每个皮肤使用一堆不同的 CSS 类并在它们之间切换有何不同?我真的无法回答。

    我认为至少可以说上述方法将确保首先使用默认(或您可能创建的其他最小皮肤),并且可以控制在初始化过程中何时实例化另一个皮肤。

    【讨论】:

    • 那是因为,但它对我不起作用。我已经从 CSS 表中删除了borderSkin 并添加了以下代码:StyleManager.getStyleDeclaration(".PanControlsBackground").setStyle("borderSkin", skins.buttons.PanControlsBackground); 这给了我一个“未定义的属性'skins'”错误。所以然后我尝试将皮肤包装在 ClassReference 中(就像在样式表中一样),但这也不起作用。
    • @swatkins - 尝试向脚本块添加导入语句。例如,import skins.buttons.PanControlsBackground;
    • 我实际上最终将 CSS 表移动到加载可见控件的内部模块 - 这延迟了皮肤的实例化,以便应用正确的颜色。出于好奇,我尝试了你的方法,它似乎奏效了。非常感谢@merv!
    猜你喜欢
    • 2019-12-10
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2018-10-03
    相关资源
    最近更新 更多