awtk/docs/theme.md
2018-07-17 11:27:14 +08:00

4.4 KiB
Raw Blame History

AWTK中的主题

设计漂亮的界面并非程序员的强项AWTK通过主题提供这样一种机制让设计漂亮的界面变得非常容易。通过主题可以改变控件的背景颜色、边框颜色、字体颜色、字体、字体大小、背景图片、背景图片的显示方式和图标等属性。同时AWTK也提供了一些主题重用的机制让主题文件的开发和维护变得容易。

一、主题的结构

AWTK的主题按控件进行分类每种控件可以有多种不同的风格每种风格下又有不同状态下的配置。比如

<button bg_image_draw_type="3patch_x" text_color="blue">
  <style name="default" border_color="#a0a0a0"  text_color="black">
    <normal     bg_color="#f0f0f0" />
    <pressed    bg_color="#c0c0c0" />
    <over       bg_color="#e0e0e0" />
    <disable    bg_color="gray" text_color="#d0d0d0" />
  </style>
  <style name="green_btn" >
    <normal   bg_image="green_btn_n" />
    <pressed  bg_image="green_btn_p" />
    <over     bg_image="green_btn_o" />
  </style>

  <style name="red_btn">
    <normal   bg_image="red_btn_n" />
    <pressed  bg_image="red_btn_p" />
    <over     bg_image="red_btn_o" />
  </style>
</button>

上面是按钮的主题配置(你可以自由增加自己需要的),其中定义了三种不同的按钮风格:

  • default 为缺省的按钮风格。
  • green_btn 是用图片实现的绿色系按钮。
  • red_btn 是用图片实现的红色系按钮。

主题的各个属性如果出现在控件中则为该控件下各个style的缺省值。如果出现在style中则为该style的下各种状态的缺省值。这样可以实现类似继承的重用机制。

同一控件可以出现多次(如上面的button出现了两次),有利于实现配置共享,让维护工作更简单。

参考demos/res/raw/theme/theme.xml

二、主题的属性

  • bg_color 背景颜色。
  • fg_color 前景颜色。用途视具体控件而定,如进度条已完成部分的颜色使用前景颜色。
  • text_color 文字的颜色
  • font_name 字体的名称。
  • font_size 字体的大小。
  • border_color 边框的颜色。
  • font_style 字体的风格(目前还不支持)取值为italic/bold/underline。可用『,』分隔。
  • text_align_h 文本的水平对齐方式。取值为left/center/right。
  • text_align_v 文本的垂直对齐方式。取值为top/middle/bottom。
  • bg_image 背景图片。
  • bg_image_draw_type 背景图片的绘制方式。
  • fg_image 前景图片。用途视具体控件而定,如进度条已完成部分的图片使用前景图片。
  • fg_image_draw_type 前景图片的绘制方式。
  • icon 图标。用途视具体控件而定如check_button的图标按钮上的图标对话框标题上的图标。
  • margin 边距。

颜色可使用标准名称,#开头的16进制值和rgba合成的值。

参考: AWTK中图片的绘制方式

三、编译主题

主题用XML文件编写然后用themegen生成C常量数据并加入资源管理器才能在程序中使用。

  • 生成C常量数据
./bin/themegen input output

参考update_res.sh

  • 加入资源管理器
#include "res/src/theme/default.data"

...

resource_manager_add(theme_default);

参考 demos/resource.c

四、为控件指定style

  • 在代码中使用函数widget_use_style指定。
  ok = button_create(dialog->client, 20, 80, 80, 30);
  widget_set_text(ok, L"Go");
  widget_use_style(ok, "green_btn");
  • 在xml界面描述文件中使用属性style指定。
<dialog name="" icon="info" x="10" y="120" w="300" h="160" text="Dialog">
  <label name="" x="center" y="middle:-20" w="200" h="30" text="Are you ready?"/>
  <button name="ok" style="green_btn" x="10" y="bottom:10" w="40%" h="30" text="Yes"/>
  <button name="cancel" style="red_btn" x="right:10" y="bottom:10" w="40%" h="30" text="No"/>
</dialog>

五、每个窗口支持独立的主题

像微信小程序那样AWTK中每个窗口(包括对话框和其它窗口)可以有自己的主题文件。

  • 通过窗口的theme属性来指定窗口的主题文件名(方便多个窗口共用一个主题文件)。

  • 如果没有指定theme属性以窗口的name属性作为窗口的主题文件名。

  • 如果没有指定name属性以窗口的UI文件名作为窗口的主题文件名。

  • 以窗口自己的主题文件优先,其次为缺省的主题文件。

参考: dialog1.xml