麦步社区-论坛
标题:
麦步智能手表开发者指南
[打印本页]
作者:
不贰小
时间:
2016-5-6 10:10
标题:
麦步智能手表开发者指南
代码,是写代码人逻辑的体现,所以要省代码,根本方法还是要逻辑清晰简单。
所以这里推荐一种写表盘的方法:
数据处理
—全局变量—窗口
显示
。
将创建/显示表盘窗口/图层,数据处理,分开成两个模块写。数据处理模块 通过 全局变量 控制 窗口模块 是否显示和显示什么。
具体来说,要写一个表盘,表盘上要显示 海拔、时间、天气等。
一、首先,我们很清楚需要显示什么,那就先写创建窗口函数吧
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;
}
复制代码
作者:
dscao
时间:
2016-5-23 22:46
这样结构之后:
int main(void)
{
simulator_init();
data_handler_per_day();
data_handler_per_minute();
g_ble_bmp_key = app_ble_check();
P_Window p_window = init_window();
/*放入窗口栈显示*/
g_window_id = app_window_stack_push(p_window);
/*注册一个事件通知回调,当有改变时,改变表盘显示数据*/
maibu_service_sys_event_subscribe(time_change);
//注册定时查询函数
app_service_timer_subscribe(5000, app_add_one, NULL);
return 0;
simulator_wait();
}
其中 //注册定时查询函数
app_service_timer_subscribe(5000, app_add_one, NULL);
始终不执行,不知怎么回事。
app_add_one 单独在后面再加一次,即结果执行一次,加两次执行两次,说明app_add_one本身应该没问题。
作者:
mark
时间:
2016-5-24 09:59
如果app_add_one回调被执行过,说明定时是有效的。这个要看下你app_add_one里面代码,
需要先获取窗口句柄,才能处理窗口相关的图层并显示。
欢迎光临 麦步社区-论坛 (http://203.195.186.190/)
Powered by Discuz! X3.2