解读 LWUIT 之十三:可插拔主题(Theming)

时间:2023-01-28 18:45:39

解读 LWUIT 之十三:可插拔主题(Theming)

LWUIT 开发指南下载
        LWUIT 库支持可类似于 CSS 的可插拔主题,比 Swing 要简单一些的可插拔的外观和感觉。
        每个 LWUIT 控件都有一个内置的 Style 对象(详细请参阅作者的前一篇博客《解读 LWUIT 之十一:风格(com.sun.lwuit.plaf.Style)对象》),我们可以(在代码中)手工操纵这个对象,也可以(使用主题配置)对这个对象进行自定义设置。例如,可以使用下面的主题将所有按钮的背景设置为红色:
Button.bgColor=ff0000
        这个主题将按钮对象的内置 Style 对象设置为红色。主题可以打包为一个资源文件(详细请参阅作者相关后续博客),它可以在程序运行时被加载或者切换。但在主题切换后(程序运行时),我们应该使用 refreshTheme 方法来手工刷新根控件(根控件指的是 Form/Dialog 等包含了我们的控件树的容器控件)来更新主题,并刷新所有控件的内置 Style 对象。
        警告:切换新主题的时候,(代码中)手工修正的 Style 对象不会受其影响,因而不会被更新。比如,如果你(在代码中)手工自定义了一个按钮的背景颜色为蓝色,当你加载或者切换到一个将所有按钮颜色设置为红色的新主题时,除了你手工定义的那个按钮实例之外的所有按钮实例都会受到影响。——这一点对于 LWUIT 程序员来说很爽:我们可以随意为特殊控件定义风格展现,而不必担心使用主题会影响到他们。就让主题去影响程序的整体展现效果去吧!
        主题文件的主旨非常类似于 CSS,但是主题文件对于 LWUIT 开发人员来说更简单,它的构造就像一个 Java 的 properties 文件:由键值对来定义主题文件。其中的“键”起到的作用类似于 CSS 的选择符,它表明控件或者属性被改变的主题的值。例如,“Button.font”就表示了所有按钮的文本字体类型。
        其中的“键”是由代表每一种控件的独一无二的标识符 ID(UUID,LWUIT 约定的控件的 UUID 对应于该控件类,比如 Button,Label,CheckBox,RadioButton,Form 等等。)和一个所要求的属性类型组成,不同于 CSS 的是 LWUIT 主题不支持类似于层级选择器或更复杂的选择符。以下是主题定义支持的属性和它们的值的语法说明(关于边框和透明度部分如果看不懂可以参阅作者前篇博客《解读 LWUIT 之十一:风格(com.sun.lwuit.plaf.Style)对象》,其中对它们进行了详细说明):
        bgAlign:定义背景图片的对齐格式(仅仅作用于程序中没有进行定义的背景图片),有效值包括:BACKGROUND_IMAGE_ALIGN_TOP,BACKGROUND_IMAGE_ALIGN_BOTTOM,BACKGROUND_IMAGE_ALIGN_LEFT,BACKGROUND_IMAGE_ALIGN_RIGHT,BACKGROUND_IMAGE_ALIGN_CENTER;
        bgGradient:定义图片的渐变度,通过定义源/目的地颜色以及 X/Y 径向渐变来对此属性进行设置;
        bgColor:代表没有选中控件的背景颜色的属性。取值只能是十六进制,比如定义为蓝色时,取值为 ff;
        bgImage:来自资源的一张图片的名字,用来定义控件的背景。所引用的图片必须存在于资源中,其名字必须和这里用到的一致。详细请参阅作者后续博客;
        bgType:顾名思义,用来定义背景的类型是为图片、颜色或者透明度。有效取值:BACKGROUND_IMAGE_SCALED,BACKGROUND_IMAGE_TILE_BOTH,BACKGROUND_IMAGE_TILE_VERTICAL,BACKGROUND_IMAGE_TILE_HORIZONTAL,BACKGROUND_IMAGE_ALIGNED,BACKGROUND_GRADIENT_LINEAR_HORIZONTAL,BACKGROUND_GRADIENT_LINEAR_VERTICAL,BACKGROUUND_GRADIENT_RADIAL;
        fgColor:(对照 bgColor)代表选中的控件的颜色的属性。取值只能是十六进制,比如定义为红色时,取值为 ff0000;
        font:build XML 文件中系统字体的名字;
        margin:边距,比如定义 1,2,3,4 的结果表示(此容器中的)每个控件到上边框为 1 个像素,到下边框为 2 个像素,到左边框为 3 个像素,到右边框为 4 个像素;
        padding:填充度,填充度的设置类似于边距,但它用来更新控件的填充度;
        transparency:一个介于 0 到 255 之间的十进制数字,定义控件背景的不透明度。0 意味着控件的背景根本就不进行绘制(就是说完全透明),而 255 则代表此控件的背景完全不透明。注意:此属性设置目前为止对背景图片无效(尽管在 LWUIT 以后的版本中可能会有效)。

        必须通过 Resources 类来安装主题,通过该类我们可以接收到已经编译好了的包含选择符和他们的值的哈希表。我们可以通过 UI 管理器的 setThemeProps 方法来更新当前主题。这就是 LWUIT 的可插拔主题。
com.sun.lwuit.plaf.LookAndFeel
        我们总是希望可以在一个地方控制所有控件的绘制,并根据需要操纵它们的展现。LWUIT 将所有的绘制大权交给了一个单独的抽象基类 LookAndFeel,我们可以通过 UIManager 来获得它的实例。LookAndFeel 有一个叫做 DefaultLookAndFeel 的子类,它提供了默认的 LWUIT 展现。LookAndFeel 和 DefaultLookAndFeel 都可以被继承,用来扩展/取代他们的具体功能。
        LookAndFeel 类拥有定义控件边界和绘制所有控件的方法,它还有其他一些将控件和特殊逻辑绑定、手工绘制诸如滚动栏控件的方法。LookAndFeel 有责任合理使用主题定义的 Style 对象,所以我们必须从主题定义中提取到控件的 Style 对象相关配置,否则 LWUIT 将会崩溃。更多关于 com.sun.lwuit.plaf.LookAndFeel 的信息请参阅其 API。