- UID
- 6
- 麦力
- 34442
- 注册时间
- 2015-3-17
- 最后登录
- 2017-6-30
麦步团队
- 精华
- 1
- 阅读权限
- 200
- 在线时间
- 812 小时
|
代码,是写代码人逻辑的体现,所以要省代码,根本方法还是要逻辑清晰简单。
所以这里推荐一种写表盘的方法:数据处理—全局变量—窗口显示。
将创建/显示表盘窗口/图层,数据处理,分开成两个模块写。数据处理模块 通过 全局变量 控制 窗口模块 是否显示和显示什么。
具体来说,要写一个表盘,表盘上要显示 海拔、时间、天气等。
一、首先,我们很清楚需要显示什么,那就先写创建窗口函数吧- P_Window ininti_window(void)
- {
- /*1.显示时间文本,可以用存储时间字符串的全局变量g_str_time来显示,
- 而它的值则是在数据处理模块改变*/
- /*2.显示海拔文本,用全局变量g_str_altitude显示海拔字符串*/
- /*2.显示天气图片,用存储图片KEY的全局变量g_bmp_key_weather控制显示天气图片*/
- }
复制代码
二、接着,这时我们就知道,需要给 窗口模块 下面提供这3个变量的值
- /*1.获取g_str_time的最新值*/
- void get_g_str_time_handler(void)
- {
- struct date_time datetime_perminute;
- app_service_get_datetime(&datetime_perminute);
-
- sprintf(g_show_more_str_time,"%02d:%02d",datetime_perminute.hour, datetime_perminute.min);
- }
- /*2.获取g_str_altitude的最新值*/
- void get_g_str_altitude_handler(void)
- {
- //获取海拔数据
- float altitude, accuracy;
- maibu_get_altitude(&altitude, &accuracy);
- //将浮点型数据转变成整形数据
- sprintf(g_show_more_str_altitude, "%d",(int)altitude);
- char MMM[2 = {'m','\0'};
- strcat(g_show_more_str_altitude,&MMM);
- }
- /*获取g_bmp_key_weather最新值*/
- void get_g_bmp_weather_handler(void)
- {
- /*处理返回的天气函数*/
- /*根据 中文/英文 天气信息,获取对应的本地图片KEY*/
- }
复制代码
三、最后,我们就可以根据最新的值,重新刷新窗口,并显示出来了
- /*此招,需要大量的计算资源,谨用*/
- /*根据经验,每分钟刷一次的时候可以用。每秒钟的话,就会出现肉眼可见的卡顿*/
- //重新载入并刷新窗口所有图层
- void window_reloading(void)
- {
- /*根据窗口ID获取窗口句柄*/
- P_Window p_old_window = app_window_stack_get_window_by_id(g_window_id);
- if (NULL != p_old_window)
- {
- P_Window p_window = init_window();
- if (NULL != p_window)
- {
- g_window_id = app_window_stack_replace_window(p_old_window, p_window);
- }
- }
-
- }
复制代码
这样,简单明了的就搞定一个表盘了。
当然,除了主干逻辑要清晰简单外,还有些细节可以注意的。
省代码空间的小技巧:
1.注意避免隐式强制转换前提下,尽量使用较小内存的数据类型。
- int a;
- char c;
- /*隐式的强制转换 char c 变为 int c */
- c = a+1;
复制代码- int a;
- int c;
- /*虽然 int 型比 char型占空间大,但是没有强制转换,代码编译后所占内存空间反而变小了*/
- c = a+1;
复制代码
2.定义结构体的时候注意4字节对齐
- struct test1{
- int a;
- char b;
- int c;
- char d[3];
- }
- /*交换一下c和d成员的位置*/
- struct test2{
- int a;
- char b;
- char d[3];
- int c;
- }
- /*同样的成员,不同的成员存放顺序,test1 会比 test2所占空间大*/
复制代码
3.重复利用变量,而不是重新定义。
- GRect temp_frame ={{0,0},{128,128}};
- /*创建下一个图层时,不用再次定义一个 GRect 类型的变量,一直使用第一个,也会省下一部分代码空间的*/
- temp_frame.origin.x = 15;
- temp_frame.origin.y = 1;
- temp_frame.size.h = 12;
- temp_frame.size.w = 54;
复制代码
4.重复代码,尽量合并。
比如:写表盘时,经常会创建很多 图片图层 或者 文本图层,我们就可以将其打包单独写成函数,调用它。
- /*创建并显示图片图层,需要p_window,坐标值,对齐方式,是否反色,存储图片key的数组,取出数组中key的值*/
- int32_t display_target_layer(P_Window p_window,GRect *temp_p_frame,enum GAlign how_to_align,enum GColor black_or_white,int32_t bmp_array_name[],int bmp_id_number)
- {
- GBitmap bmp_point;
- P_Layer temp_P_Layer = NULL;
- res_get_user_bitmap(bmp_array_name[bmp_id_number], &bmp_point);
- LayerBitmap layer_bitmap_struct_l = {bmp_point, *temp_p_frame, how_to_align};
- temp_P_Layer = app_layer_create_bitmap(&layer_bitmap_struct_l);
-
- if(temp_P_Layer != NULL)
- {
- app_layer_set_bg_color(temp_P_Layer, black_or_white);
- return app_window_add_layer(p_window, temp_P_Layer);
- }
- return 0;
- }
- /*创建并显示文本图层*/
- int32_t display_target_layerText(P_Window p_window,GRect *temp_p_frame,enum GAlign how_to_align,enum GColor color,char * str,uint8_t font_type)
- {
- LayerText temp_LayerText = {0};
- temp_LayerText.text = str;
- temp_LayerText.frame = *temp_p_frame;
- temp_LayerText.alignment = how_to_align;
- temp_LayerText.font_type = font_type;
-
- P_Layer p_layer = app_layer_create_text(&temp_LayerText);
-
- if(p_layer != NULL)
- {
- app_layer_set_bg_color(p_layer, color);
- return app_window_add_layer(p_window, p_layer);
- }
- return 0;
- }
复制代码
|
|