AWTK 开发实践
V0.70
目录
1.4
2.1
2.2
2.3
2.4
2.5
2.6
1.1
1.2
1.3
目录 ································································································ 1
第 1 章 初识 AWTK ············································································ 8
简介 ····························································································· 8
特色 ····························································································· 8
AWTK 环境搭建 ············································································· 9
1.3.1 下载 AWTK ············································································· 9
1.3.2 编译 AWTK ············································································· 9
awtk_config.py 文件说明 ································································· 10
1.4.1 渲染方式··············································································· 10
1.4.2 是否支持 png/jpeg 图片 ····························································· 11
1.4.3 是否使用点阵字体 ··································································· 11
1.4.4 是否使用输入法 ······································································ 11
1.4.5 是否有标准的内存分配函数 ······················································· 11
1.4.6 是否支持裸机系统 ··································································· 11
1.4.7 是否在嵌入式系统运行 ···························································· 12
第 2 章 第一个 AWTK 应用 ································································· 13
简介 ··························································································· 13
生成资源文件 ·············································································· 13
2.2.1 Windows 平台 ········································································ 13
Linux 平台 ············································································· 14
2.2.2
编译源代码 ················································································· 14
调试 ··························································································· 15
Visual Studio ·········································································· 15
Visual Studio Code ··································································· 15
目录结构介绍 ·············································································· 16
代码实现····················································································· 17
2.6.1 主函数入口 ··········································································· 17
2.6.2 创建界面··············································································· 19
2.6.3 响应按钮事件 ········································································ 20
2.6.4 响应文本正在改变事件 ···························································· 21
第 3 章 开发基础 ·············································································· 23
简介 ··························································································· 23
主题样式····················································································· 23
3.2.1 主题结构··············································································· 23
3.2.2 主题属性··············································································· 24
3.2.3 控件状态··············································································· 24
3.2.4 为控件指定 style ····································································· 25
3.2.5 每个窗口支持独立的主题 ························································· 26
inline style ············································································· 26
3.2.6
布局管理器 ················································································· 27
3.3.1 为什么需要布局参数 ······························································· 27
2.4.1
2.4.2
3.1
3.2
3.3
1
AWTK 开发实践
4.3
4.4
4.5
3.4
3.5
3.6
4.1
4.2
V0.70
3.3.2 概述 ····················································································· 27
3.3.3 示例 ····················································································· 28
3.3.4 控件自身的布局 ····································································· 29
3.3.5 子控件的布局 ········································································ 31
定时器························································································ 38
idle 定时器 ·················································································· 39
3.5.1 示例 ····················································································· 39
3.5.2 函数 ····················································································· 39
事件处理····················································································· 41
第 4 章 框架控件的开发应用 ······························································· 43
简介 ··························································································· 43
widget ························································································ 44
4.2.1 函数 ····················································································· 44
4.2.2 属性 ····················································································· 46
4.2.3 事件 ····················································································· 47
window_manager ··········································································· 47
4.3.1 函数 ····················································································· 48
4.3.2 属性 ····················································································· 48
窗口 ··························································································· 48
window ················································································· 48
dialog ··················································································· 51
system_bar ············································································· 57
calibration_win ········································································ 58
基本控件····················································································· 60
button ··················································································· 61
label ····················································································· 63
edit ······················································································ 65
image ··················································································· 72
spin_box················································································ 74
combo_box ············································································ 76
color_tile ··············································································· 80
dialog_title ············································································· 82
dialog_client ··········································································· 84
slider ···················································································· 85
progress_bar ··········································································· 89
tab_control ············································································· 92
tab_button ·············································································· 93
tab_button_group ····································································· 96
check_button ·········································································· 97
radio_button ··········································································· 99
dragger ················································································ 101
通用容器控件 ············································································· 103
row ····················································································· 103
column ················································································· 104
4.5.1
4.5.2
4.5.3
4.5.4
4.5.5
4.5.6
4.5.7
4.5.8
4.5.9
4.5.10
4.5.11
4.5.12
4.5.13
4.5.14
4.5.15
4.5.16
4.5.17
4.4.1
4.4.2
4.4.3
4.4.4
4.6.1
4.6.2
4.6
2
AWTK 开发实践
4.7
4.6.3
4.6.4
4.6.5
4.6.6
4.6.7
4.6.8
V0.70
grid ····················································································· 106
view ···················································································· 107
grid_item ·············································································· 108
group_box············································································· 109
app_bar ················································································ 110
button_group ········································································· 111
扩展控件···················································································· 113
canvas_widget ········································································ 114
4.7.1
color_picker ·········································································· 115
4.7.2
gif_image ············································································· 118
4.7.3
guage ·················································································· 119
4.7.4
guage_pointer ········································································ 121
4.7.5
image_animation ····································································· 123
4.7.6
image_value ·········································································· 128
4.7.7
keyboard ·············································································· 130
4.7.8
progress_circle ······································································· 132
4.7.9
rich_text ··············································································· 136
4.7.10
slide_menu ············································································ 138
4.7.11
slide_view············································································· 140
4.7.12
svg_image············································································· 143
4.7.13
switch ·················································································· 145
4.7.14
text_selector ·········································································· 146
4.7.15
time_clock ············································································ 152
4.7.16
digit_clock ············································································ 156
4.7.17
list_view··············································································· 158
4.7.18
list_view_h············································································ 160
4.7.19
list_item ··············································································· 162
4.7.20
scroll_bar·············································································· 164
4.7.21
scroll_view············································································ 168
4.7.22
4.7.23 mutable_image ······································································· 172
4.7.24 mledit ·················································································· 173
4.7.25
line_number ·········································································· 176
slide_indicator ········································································ 179
4.7.26
overlay ················································································· 183
4.7.27
hscroll_label ·········································································· 185
4.7.28
自定义控件 ················································································ 189
4.8.1 注册控件·············································································· 189
4.8.2 创建控件·············································································· 189
4.8.3 使用控件·············································································· 196
第 5 章 动画 ·················································································· 198
简介 ·························································································· 198
窗口动画···················································································· 198
5.2.1 动画类型·············································································· 198
5.2.2 使用方法·············································································· 198
4.8
5.1
5.2
3
AWTK 开发实践
5.3
6.1
6.2
V0.70
5.2.3 动画参数·············································································· 199
5.2.4 示例 ···················································································· 199
5.2.5 自定义动画 ·········································································· 200
控件动画···················································································· 200
5.3.1 动画类型·············································································· 200
5.3.2 特色 ···················································································· 201
5.3.3 函数 ···················································································· 201
XML 参数 ············································································ 205
5.3.4
5.3.5 插值算法名称(easing) ·························································· 206
5.3.6 示例 ···················································································· 207
第 6 章 画布 ·················································································· 209
普通画布···················································································· 209
6.1.1 简介 ···················································································· 209
6.1.2 函数 ···················································································· 209
6.1.3 属性 ···················································································· 210
6.1.4 示例 ···················································································· 210
矢量图画布 ················································································ 210
6.2.1 简介 ···················································································· 210
6.2.2 函数 ···················································································· 211
6.2.3 属性 ···················································································· 212
6.2.4 示例 ···················································································· 212
第 7 章 输入法 ··············································································· 215
简介 ·························································································· 215
软键盘······················································································· 215
键盘类型···················································································· 215
自定义键盘 ················································································ 216
加入中文输入法 ·········································································· 218
示例 ·························································································· 219
第 8 章 多国语言互译 ······································································ 221
简介 ·························································································· 221
语言文件介绍 ············································································· 221
文本翻译···················································································· 222
XML 上文本互译 ··································································· 222
8.3.1
C 代码上文本互译 ·································································· 222
8.3.2
8.3.3 如何实时切换语言 ································································· 222
图片翻译···················································································· 223
第 9 章 深入理解 AWTK ·································································· 224
简介 ·························································································· 224
资源管理器 ················································································ 224
9.2.1 资源的生成 ·········································································· 225
9.2.2 相关工具·············································································· 225
9.2.3 初始化················································································· 225
9.2.4 使用方法·············································································· 226
9.2.5 资源的名称 ·········································································· 227
7.1
7.2
7.3
7.4
7.5
7.6
8.1
8.2
8.3
8.4
9.1
9.2
4
AWTK 开发实践
10.1
10.2
9.3
9.4
V0.70
LCD 旋转 ··················································································· 228
9.3.1 使用方法·············································································· 228
LCD 实现方式对旋转的影响 ····················································· 228
9.3.2
API 注释格式 ·············································································· 229
9.4.1 类的注释·············································································· 229
9.4.2 类成员变量注释 ···································································· 229
9.4.3 函数的注释 ·········································································· 230
9.4.4 枚举的注释 ·········································································· 231
第 10 章 经典案例 ··········································································· 233
简介 ·························································································· 233
仪表监控系统 ············································································· 233
10.2.1 功能详解·············································································· 233
10.2.2 应用实现·············································································· 233
洁净新风系统 ············································································· 237
10.3.1 功能详解·············································································· 237
10.3.2 应用实现·············································································· 238
炫酷图表···················································································· 249
10.4.1 功能详解·············································································· 249
10.4.2 应用实现·············································································· 249
音乐播放器 ················································································ 263
10.5.1 功能详解·············································································· 263
10.5.2 应用实现·············································································· 264
智能手表···················································································· 273
10.6.1 功能详解·············································································· 273
10.6.2 应用实现·············································································· 273
附录 A 把应用迁移到 AWorks ···························································· 290
建立工程···················································································· 290
编译工程···················································································· 291
如何升级 AWTK ·········································································· 294
附录 B 把应用迁移到嵌入式 Linux ····················································· 295
附录 C 字体裁剪 ············································································ 297
默认字体···················································································· 297
裁剪字体···················································································· 297
附录 D 启用鼠标指针 ······································································ 298
demo 启用鼠标指针 ······································································ 298
在应用程序启用鼠标指针 ······························································ 298
指针图片的要求 ·········································································· 298
附录 E 基本函数库 ········································································· 299
memory······················································································ 299
E.1.1 函数 ···················································································· 299
E.1.2 示例 ···················································································· 300
rgba ·························································································· 300
E.2.1 属性 ···················································································· 300
color ························································································· 300
D.1
D.2
D.3
A.1
A.2
A.3
E.2
E.3
C.1
C.2
10.3
10.4
10.5
10.6
E.1
5
AWTK 开发实践
V0.70
E.3.1 函数 ···················································································· 300
E.3.2 属性 ···················································································· 300
E.3.3 示例 ···················································································· 300
color_parse·················································································· 301
E.4.1 函数 ···················································································· 301
E.4.2 示例 ···················································································· 301
value ························································································· 301
E.5.1 函数 ···················································································· 301
E.5.2 示例 ···················································································· 302
str ····························································································· 302
E.6.1 函数 ···················································································· 302
E.6.2 属性 ···················································································· 303
E.6.3 示例 ···················································································· 303
wstr ·························································································· 304
E.7.1 函数 ···················································································· 304
E.7.2 属性 ···················································································· 304
E.7.3 示例 ···················································································· 305
darray ························································································ 305
E.8.1 函数 ···················································································· 305
E.8.2 属性 ···················································································· 305
E.8.3 示例 ···················································································· 306
wbuffer ······················································································ 306
E.9.1 函数 ···················································································· 306
E.9.2 属性 ···················································································· 306
E.9.3 示例 ···················································································· 307
rbuffer ······················································································· 307
E.10.1 函数 ···················································································· 307
E.10.2 属性 ···················································································· 307
E.10.3 示例 ···················································································· 308
date_time ···················································································· 308
E.11.1 函数 ···················································································· 308
E.11.2 属性 ···················································································· 308
E.11.3 示例 ···················································································· 309
event ························································································· 309
E.12.1 函数 ···················································································· 309
E.12.2 属性 ···················································································· 309
E.12.3 示例 ···················································································· 309
slist ··························································································· 309
E.13.1 函数 ···················································································· 309
E.13.2 属性 ···················································································· 310
E.13.3 示例 ···················································································· 310
system_info ················································································· 310
E.14.1 函数 ···················································································· 310
E.14.2 属性 ···················································································· 311
E.4
E.5
E.6
E.7
E.8
E.9
E.10
E.11
E.12
E.13
E.14
6
AWTK 开发实践
E.15
V0.70
tk_thread ···················································································· 311
E.15.1 函数 ···················································································· 311
E.15.2 示例 ···················································································· 312
tk_mutex ···················································································· 312
E.16.1 函数 ···················································································· 312
E.16.2 示例 ···················································································· 312
tk_cond_var················································································· 312
E.17.1 函数 ···················································································· 312
附录 F 修订历史 ············································································· 314
E.16
E.17
7
AWTK 开发实践
V0.70
第1章 初识 AWTK
✍本章导读
随着手机、智能手表等便携式设备的普及,用户对 GUI 的要求越来越高,嵌入式系统
对 GUI 的需求也越来越迫切,本章将为大家介绍一个轻型、占用资源少、高性能、高可靠、
便于移植、可配置及美观的 GUI 编程框架。
1.1 简介
AWTK(Toolkit AnyWhere)是一套基于 C 语言开发的 GUI 框架,目前支持的平台有嵌
入式、Linux、Mac OS X、Windows,后续会支持 Android、iOS 平台下的 APP,以及 2D 游
戏的开发。
1.2 特色
1. 小巧。在精简配置下,不依赖第三方软件包,仅需要 8K RAM+32K FLASH 即可开
发一些简单的图形应用程序。
2. 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率。
3. 稳定。通过良好的架构设计、编程风格、单元测试、动态(valgrind)检查和 Code
Review 保证其运行的稳定性。
4. 丰富的 GUI 组件。提供窗口、对话框和各种常用的组件(用户可以配置自己需要
的组件,降低对运行环境的要求)。
5. 支持多种字体格式。内置位图字体(并提供转换工具),也可以使用 stb_truetype
或 freetype 加载 ttf 字体。
6. 支持多种图片格式。内置位图图片(并提供转换工具),也可以使用 stb_image 加
载 png/jpg 等格式的图片。
7. 紧凑的二进制界面描述格式。可以使用手工编辑的 XML 格式的界面描述文件,也
可以使用 Qt Designer 设计界面,然后转换成紧凑的二进制界面描述格式文件,提
高运行效率,减小内存开销。
8. 支持主题并采用紧凑的二进制格式。开发时使用 XML 格式描述主题,然后转换成
紧凑的二进制格式,提高运行效率,减小内存开销。
9. 支持裸系统,无需 OS 和文件系统。字体、图片、主题和界面描述数据都编译到代
码中,以常量数据的形式存放,运行时无需加载到内存。
10. 内置 nanovg 实现高质量的矢量动画。
11. 支持窗口动画、控件动画、滑动动画和高清 LCD 等现代 GUI 常见特性。
12. 支持国际化(Unicode、字符串翻译和输入法等)。
13. 可移植。支持移植到各种 RTOS 和嵌入式 Linux 系统,并通过 SDL 在各种流行的
PC/手机系统上运行。
14. 脚本化。从 API 注释中提取 API 的描述信息,通过这些信息可以自动生成各种脚
本的绑定代码。
15. 支持硬件 2D 加速(目前支持 STM32 的 DMA2D 和 NXP 的 PXP)和 GPU 加速
(OpenGL/OpenGLES/DirectX/Metal),充分挖掘硬件潜能。
16. 采用 LGPL 协议开源发布,在商业软件中使用时无需付费。
8