一、 AWTK结构
AWTK 采用树的结构,最顶级是窗口管理器(window_manager)单例,其子集为窗口对象,窗口对象的子集为各个控件,其中每个控件都可以作为其他控件的父集,从而构成一颗 AWTK 控件大树,如下图:
备注:
- 当父集被删除后,其子集也会被删除。
- AWTK 的坐标系是左上角为(0,0),从左上角到右下角,x 和 y 的值越来越大。
- 在 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!