AWTK遇到问题总结

本文深入解析AWTK框架的结构、实现流程、资源管理、事件处理、中英互译、文本显示、计时处理及滚动列表创建,涵盖XML转BIN、字体资源生成、滚动列表模板、界面创建与C应用结合等关键内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 AWTK结构

AWTK 采用树的结构,最顶级是窗口管理器(window_manager)单例,其子集为窗口对象,窗口对象的子集为各个控件,其中每个控件都可以作为其他控件的父集,从而构成一颗 AWTK 控件大树,如下图:
在这里插入图片描述

备注:

  1. 当父集被删除后,其子集也会被删除。
  2. AWTK 的坐标系是左上角为(0,0),从左上角到右下角,x 和 y 的值越来越大。
  3. 在 awtk\src\widgets 和 awtk\src\ext_widgets 文件夹下放在各种各样的控件,有兴趣的朋友可以去看一下。

二、AWTK实现流程

在这里插入图片描述

三、资源管理器

  • 资源管理器配合图片管理器等其它组件实现
  • 资源的自动缓存
  • 负责资源管理器和资源管理相关的组件

在这里插入图片描述

四、事件处理

在 AWTK 内部,AWTK 通过函数 tk_run 启动的主事件循环不停的捕捉用户触发的事件和事件队列中的事件,然后将它们转换成对应的事件
在这里插入图片描述

五、中英互译

  • 1、由string文件夹中string.xml文件撰写;
在 . xml文档中文本用tr_text命名
C语言widget_set_tr_text( ," ");
  • 2、l函数ocal_info_change()实现互译
#######实现中英文互译#######
static ret_t ChangeLocale(const char* str)
{
	char country[3];
	char language[3];

	strncpy(language, str, 2);
	strncpy(country, str + 3, 2);
	locale_info_change(locale_info(), language, country);

	return RET_OK;
}

if (curlanguage == CHINESE)
{
	ChangeLocale("zh_CN");
}
else if (curlanguage == ENGLISH)
{
	ChangeLocale("en_US");
}
	

- 补充互译(出现问题)
①、🙃 翻译的strings.xml文件怎么转换为bin文件。(不通过AWTK designer)
ANS:

第一步将strings.xml复制到awtk\bin文件中,
第二步在awtk\bin目录下,创建test 文件夹
第三步打开命令提示符,找到相应的awtk\bin的位置,输入strgen.exe strings.xml test bin,点击执行就可以实现将strings.xml转为strings.bin

②、🙃 ⑴. 遇到用locale_info_change(),改变中英文语言,出现有些汉字显示不出来的现象?
⑵.还存在有些英文的地方文本设置tr_text,但互译转中文却还是显示英文,即<string name="Mon">这里的name是什么值? ⑶. `tr_text文本内容必须先为英文才能互译?strings.xml 需要将互译的name与tr_text的内容相同,否则无法实现互译?

如图**
在这里插入图片描述

ANS:

第一问题:改变中英文语言,出现有些汉字显示不出来的现象?ANS: 发现是fonts文件里面的default.ttf是缺省文件,没有显示全部的字体。我将字体改为default_full.ttf (完整的字体),之前字体没有显示出来的都显示出来了。
第二问题:还存在有些英文的地方文本设置tr_text,但是转中文还是显示英文,即<string name="Mon">这里的name是什么值?ANS: 根据实际操作可以看出<string name = 就是text 的内容,比如看下面代码,创建一个label,其值为label文本的内容——“Mon”。
第三问题:`tr_text文本内容必须先为英文才能互译?strings.xml 需要将互译的name与tr_text的内容相同,否则无法实现互译?tr_text可以不是英文,string.xml中的name表示原始文本=tr_text的值,其是一个索引值。不要错把string.xml的名字理解为了控件的名字。而是name=tr_text。
/****************/
		widget_t* label = label_create(win, 32, 60, 100, 30);
		widget_set_name(label_name, "label");
		widget_set_tr_text(label_name, "Mon");

/******************/

**③、🙃在将AWTK界面移植到单片机中,会注意到内存的问题(若内存足够可以忽略),string.xml会存在一个问题,如图圈起来的地方,即"Sun"要保存2份数据,一份是索引值,一份是翻译需要保存的,字符数少的话,还好,但是如果多的话就会造成冗余。 **
在这里插入图片描述
ANS:
解决办法,将<string name="Sun">的"Sun",这个索引值换成数字,即将索引值变为数字,里面的language不变。


/**缺点是:widget_set_tr_text,text文本需要知道原来要填的值**/
<string name="1">
  <language name="en_US">Mon</language>
  <language name="zh_CN">星期一</language>
</string>
<string name="2">
  <language name="en_US">Tues</language>
  <language name="zh_CN">星期二</language>
</string>
<string name="3">
  <language name="en_US">Wed</language>
  <language name="zh_CN">星期三</language>
</string>
<string name="4">
  <language name="en_US">Thur</language>
  <language name="zh_CN">星期四</language>
</string>
<string name="5">
  <language name="en_US">Fri</language>
  <language name="zh_CN">星期五</language>
</string>
<string name="6">
  <language name="en_US">Sat</language>
  <language name="zh_CN">星期六</language>
</string>
<string name="7">
  <language name="en_US">Sun</language>
  <language name="zh_CN">星期日</language>
</string>

六、文本显示

方式一:

 		int x;
		widget_t* labelx = label_create(list_itemx, 0, 0, 40, 40);

		char text[32];
		x++;
		tk_snprintf(text, sizeof(text), "%d", x);
		widget_set_text_utf8(labelx, text);
		widget_set_name(list_itemx, text);

方式二:

		widget_t* labelx = label_create(list_itemx, 0, 0, 40, 40);
		widget_set_text(labelx, L"列表");

方式三:

	widget_t* labelx = label_create(list_itemx, 0, 0, 40, 40);
	widget_set_tr_text(labelx , "空");

其他问题:
1、尝试拿别的字体如:verdana.ttf改为default.ttf发现显示出来的汉字却是乱码
ANS:
widget_set_text(label, L"短信");
转为用
widget_set_text_utf8(label, (wchar_t *)"短信");
就可以将乱码显示为汉字显示了。

2、fonts文件夹中的text.txt文件是怎么来的?自己输入?因为在官方的fonts文件夹中也发现了text文件。
ANS:
官方提供的text.txt文件只是用来做位图字体的裁剪指导,告诉fontgen工具该保存那些字体,。

3、fontgen.exe,字体资源生成是怎么应用,有点不理解那个str是string.xml?能麻烦举个例子吗?
ANS:
string.xml中的只是字体的切换而已,本质就是awtk内部调用widget_set_text函数切换不同语言

4、是不是只能用官方提供的字体,其他字体应用会出错?**
ANS:
主要支持ttf格式字体,还要看一些字体的内部的签名什么,并不是所有的ttf格式都支持,但是大部分都是支持的。做产品还算要注意该字体是不是开源的。

七、计时处理

计时器有三个主要的部分,

  • 触发事件

  • 触发时间

  • 是否连续触发

在这里插入图片描述

timer 回调函数:

->返回 RET_REPEAT,则下次继续执行;
->返回其他值(如:RET_REMOVE),则只执行一次。

uint32_t timer_add(timer_func_t on_timer, void* ctx, uint32_t duration);

on_timer:回调函数
ctx:定时器定义回调函数上下文
duration:时间间隔(单位为毫秒)

在程序逻辑调用UI界面设计时,ctx要为整体的UI界面widget_t*值。
应用:
timer_add(label_num_set, scan_win, 1000);
看下面代码:

static void time_now_str(char* str, size_t size)
{

	int32_t sec = num % 60;
	int32_t min = num / 60;
	num++;
	snprintf(str, size, "%02d:%02d", min,sec);
}

static ret_t label_num_set(const timer_info_t* timer)
{
	widget_t* win = WIDGET(timer->ctx);
	widget_t* label_min = widget_lookup(win, "timer", TRUE);

	if (label_min) 
	{
		char text[64];
		time_now_str(text, sizeof(text));
		widget_set_text_utf8(label_min, text);

		return RET_REPEAT;
	}
}

ret_t open_region_window(void* ctx, event_t* e)
{
	widget_t* scan_win = window_open("region");
	if (scan_win != NULL)
	{
		init_children_widget(scan_win);
		timer_add(label_num_set, scan_win, 1000);
		
		return RET_OK;
	}
	return RET_FAIL;
}

八、关于滚动列表创建模板——xml

<list_view        >
	<scroll_view        >
		 <list_item      >
		 
		 </list_item>
		 <list_item      >
		 
		 </list_item>
		  ...
 	</scroll_view>
        <scroll_bar_m    />
</list_view>

例子:

<list_view x="c" y="50" w="90%" h="70%" item_height="100">
            <scroll_view name="view" x="c" y="m" w="100%" h="100%">
              
                <list_item style="a" children_layout="default(rows=1,cols=1)">
                    <view x="c" y="m" w="100%" h="95%" style="dragger">
                        <column x="50" y="m" w="100%" h="100%">
                            <image x="0" y="m" w="88" h="88" image="app_message_normal_88" draw_type="scale_auto"/>
                            <row x="90" y="m" w="200" h="100%">
                                <digit_clock x="0" y="0" w="100%" h="50%" format="hh:mm" />
                                <label x="0" y="50%" w="100%" h="50%" text="天气晴朗" />
                            </row>
                        </column>
                    </view>
                </list_item>
                <list_item style="a" children_layout="default(rows=1,cols=1)">
                    <view x="c" y="m" w="100%" h="95%" >
                        <column x="50" y="m" w="100%" h="100%">
                            <image x="0" y="m" w="88" h="88" image="app_message_normal_88" draw_type="scale_auto"/>
                            <row x="90" y="m" w="200" h="100%">
                                <digit_clock x="0" y="0" w="100%" h="50%" format="hh:mm" />
                                <label x="0" y="50%" w="100%" h="50%" text="你好啊在干嘛?" />
                            </row>
                        </column>
                    </view>
                </list_item>
                <list_item style="a" children_layout="default(rows=1,cols=1)">
                    <view x="c" y="m" w="100%" h="95%" >
                        <column x="50" y="m" w="100%" h="100%">
                            <image x="0" y="m" w="88" h="88" image="app_message_normal_88" draw_type="scale_auto"/>
                            <row x="90" y="m" w="200" h="100%">
                                <digit_clock x="0" y="0" w="100%" h="50%" format="hh:mm" />
                                <label x="0" y="50%" w="100%" h="50%" text="多久没运动了" />
                            </row>
                        </column>
                    </view>
                </list_item>
            </scroll_view>
            <scroll_bar_m name="bar" x="right" y="0" w="6" h="100%" value="0"/>
        </list_view>

九、需要注意(出现问题)

1 xml_to_ui 工具把 XML 文件转为 bin 文件
ANS:
打开命令行,设置库源代码的bin文件夹 ( res\assets\bin 文件夹),并将xml文件放在bin文件夹中,然后输入下面就可以生成新的 bin 文件,然后运就可以把文件转移到创建的ui文件夹中

E:\awtk\awtk_other\bin>xml_to_ui.exe ma.xml ma.bin bin

2 有用XML创建界面,怎么和C应用
ANS:
有用XML来创建界面,但是又要在XML创建的界面空白处,在新建一些部件,之前都在新建一个窗口,但是无论新建多小的窗口都会覆盖掉XML创建的,我刚刚试了下用创建XML的句柄来创建新的窗口。就不会被覆盖。
前提:XML创建的头以下面为开头,若以其他为开头会出错,需要将其转换是窗口

<window >
...
<\window>

————————————————————————————————————————
感谢WNs_ACE博主的解答!
小白一枚,有错望指正,谢谢o( ̄▽ ̄)o!

AWTK开发手册-AWTK开发实践指南-中文手册.pdf AWTK = Toolkit AnyWhere 随着手机、智能手表等便携式设备的普及,用户对 GUI 的要求越来越高,嵌入式系统对高性能、高可靠性、低功耗、美观炫酷的 GUI 的需求也越来越迫切,ZLG开源 GUI 引擎 AWTK 应运而生。AWTK 全称为 Toolkit AnyWhere,是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎,并支持跨平台同步开发,一次编程,终生使用。 最终目标: 支持开发嵌入式软件。 支持开发Linux应用程序。 支持开发MacOS应用程序。 支持开发Windows应用程序。 支持开发Android应用程序。 支持开发iOS应用程序。 支持开发2D游戏。 其主要特色有: 小巧。在精简配置下,不依赖第三方软件包,仅需要32K RAM + 256K FLASH即可开发一些简单的图形应用程序。 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率和能源利用率。 稳定。通过良好的架构设计和编程风格、单元测试、动态(valgrind)检查和Code Review保证其运行的稳定性。 丰富的GUI组件。提供窗口、对话框和各种常用的组件(用户可以配置自己需要的组件,降低对运行环境的要求)。 支持多种字体格式。内置位图字体(并提供转换工具),也可以使用stb_truetype或freetype加载ttf字体。 支持多种图片格式。内置位图图片(并提供转换工具),也可以使用stb_image加载png/jpg等格式的图片。 紧凑的二进制界面描述格式。可以手工编辑的XML格式的界面描述文件,也可以使用Qt Designer设计界面,然后转换成紧凑的二进制界面描述格式,提高运行效率,减小内存开销。 支持主题并采用紧凑的二进制格式。开发时使用XML格式描述主题,然后转换成紧凑的二进制格式,提高运行效率,减小内存开销。 支持裸系统,无需OS和文件系统。字体、图片、主题和界面描述数据都编译到代码中,以常量数据的形式存放,运行时无需加载到内存。 内置nanovg实现高质量的矢量动画,并支持SVG矢量图。 支持窗口动画、控件动画、滑动动画和高清LCD等现代GUI常见特性。 支持国际化(Unicode、字符串翻译和输入法等)。 可移植。支持移植到各种RTOS和嵌入式Linux系统,并通过SDL在各种流行的PC/手机系统上运行。 脚本化。从API注释中提取API的描述信息,通过这些信息可以自动生成各种脚本的绑定代码。 支持硬件2D加速(目前支持STM32的DMA2D和NXP的PXP)和GPU加速(OpenGL/OpenGLES/DirectX/Metal),充分挖掘硬件潜能。 丰富的文档和示例代码。 采用LGPL协议开源发布,在商业软件中使用时无需付费。 目前核心功能已经完成,内部开始在实际项目中使用了,欢迎有兴趣的朋友评估和尝试,期待您的反馈。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值