麦步社区-论坛

标题: 麦步智能手表开发者指南 [打印本页]

作者: 不贰小    时间: 2016-5-6 10:10
标题: 麦步智能手表开发者指南
代码,是写代码人逻辑的体现,所以要省代码,根本方法还是要逻辑清晰简单。


所以这里推荐一种写表盘的方法:数据处理—全局变量—窗口显示
将创建/显示表盘窗口/图层,数据处理,分开成两个模块写。数据处理模块 通过 全局变量 控制 窗口模块 是否显示和显示什么。


具体来说,要写一个表盘,表盘上要显示 海拔、时间、天气等。


一、首先,我们很清楚需要显示什么,那就先写创建窗口函数吧
  1. P_Window ininti_window(void)
  2. {
  3. /*1.显示时间文本,可以用存储时间字符串的全局变量g_str_time来显示,
  4.     而它的值则是在数据处理模块改变*/

  5. /*2.显示海拔文本,用全局变量g_str_altitude显示海拔字符串*/

  6. /*2.显示天气图片,用存储图片KEY的全局变量g_bmp_key_weather控制显示天气图片*/

  7. }
复制代码

二、接着,这时我们就知道,需要给 窗口模块 下面提供这3个变量的值
  1. /*1.获取g_str_time的最新值*/
  2. void get_g_str_time_handler(void)
  3. {
  4.     struct date_time datetime_perminute;
  5.     app_service_get_datetime(&datetime_perminute);
  6.             
  7.     sprintf(g_show_more_str_time,"%02d:%02d",datetime_perminute.hour, datetime_perminute.min);
  8. }

  9. /*2.获取g_str_altitude的最新值*/
  10. void get_g_str_altitude_handler(void)
  11. {
  12.     //获取海拔数据
  13.     float altitude, accuracy;
  14.     maibu_get_altitude(&altitude, &accuracy);  
  15.     //将浮点型数据转变成整形数据
  16.     sprintf(g_show_more_str_altitude, "%d",(int)altitude);  
  17.     char MMM[2 = {'m','\0'};
  18.     strcat(g_show_more_str_altitude,&MMM);
  19. }
  20. /*获取g_bmp_key_weather最新值*/
  21. void get_g_bmp_weather_handler(void)
  22. {
  23.      /*处理返回的天气函数*/
  24.      /*根据 中文/英文 天气信息,获取对应的本地图片KEY*/
  25. }
复制代码

三、最后,我们就可以根据最新的值,重新刷新窗口,并显示出来了
  1. /*此招,需要大量的计算资源,谨用*/
  2. /*根据经验,每分钟刷一次的时候可以用。每秒钟的话,就会出现肉眼可见的卡顿*/


  3. //重新载入并刷新窗口所有图层

  4. void window_reloading(void)
  5. {
  6.         /*根据窗口ID获取窗口句柄*/
  7.         P_Window p_old_window = app_window_stack_get_window_by_id(g_window_id);
  8.         if (NULL != p_old_window)
  9.         {
  10.                 P_Window p_window = init_window();
  11.                 if (NULL != p_window)
  12.                 {
  13.                         g_window_id = app_window_stack_replace_window(p_old_window, p_window);
  14.                 }        
  15.         }
  16.         
  17. }
复制代码

这样,简单明了的就搞定一个表盘了。

当然,除了主干逻辑要清晰简单外,还有些细节可以注意的。


省代码空间的小技巧:
1.注意避免隐式强制转换前提下,尽量使用较小内存的数据类型。
  1. int a;
  2. char c;
  3. /*隐式的强制转换 char c 变为 int c */
  4. c = a+1;
复制代码
  1. int a;
  2. int c;
  3. /*虽然 int 型比 char型占空间大,但是没有强制转换,代码编译后所占内存空间反而变小了*/
  4. c = a+1;
复制代码

2.定义结构体的时候注意4字节对齐
  1. struct test1{
  2.     int a;
  3.     char b;
  4.     int c;
  5.     char d[3];
  6. }


  7. /*交换一下c和d成员的位置*/
  8. struct test2{
  9.     int a;
  10.     char b;
  11.     char d[3];
  12.     int c;
  13. }
  14. /*同样的成员,不同的成员存放顺序,test1 会比 test2所占空间大*/
复制代码

3.重复利用变量,而不是重新定义。
  1. GRect temp_frame ={{0,0},{128,128}};

  2. /*创建下一个图层时,不用再次定义一个 GRect 类型的变量,一直使用第一个,也会省下一部分代码空间的*/
  3. temp_frame.origin.x = 15;
  4. temp_frame.origin.y = 1;
  5. temp_frame.size.h = 12;
  6. temp_frame.size.w = 54;
复制代码

4.重复代码,尽量合并。
比如:写表盘时,经常会创建很多 图片图层 或者 文本图层,我们就可以将其打包单独写成函数,调用它。
  1. /*创建并显示图片图层,需要p_window,坐标值,对齐方式,是否反色,存储图片key的数组,取出数组中key的值*/
  2. 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)
  3. {        


  4.         GBitmap bmp_point;
  5.         P_Layer temp_P_Layer = NULL;

  6.         res_get_user_bitmap(bmp_array_name[bmp_id_number], &bmp_point);
  7.         LayerBitmap layer_bitmap_struct_l = {bmp_point, *temp_p_frame, how_to_align};
  8.          temp_P_Layer = app_layer_create_bitmap(&layer_bitmap_struct_l);
  9.         
  10.         if(temp_P_Layer != NULL)
  11.         {
  12.                 app_layer_set_bg_color(temp_P_Layer, black_or_white);
  13.                 return app_window_add_layer(p_window, temp_P_Layer);
  14.         }

  15.         return 0;
  16. }


  17. /*创建并显示文本图层*/
  18. 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)
  19. {
  20.         LayerText temp_LayerText = {0};
  21.         temp_LayerText.text = str;
  22.         temp_LayerText.frame = *temp_p_frame;
  23.         temp_LayerText.alignment = how_to_align;
  24.         temp_LayerText.font_type = font_type;
  25.         
  26.         P_Layer p_layer = app_layer_create_text(&temp_LayerText);
  27.         
  28.         if(p_layer != NULL)
  29.         {
  30.                 app_layer_set_bg_color(p_layer, color);
  31.                 return app_window_add_layer(p_window, p_layer);
  32.         }
  33.         return 0;
  34. }
复制代码







作者: 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://bbs.maibu.cc/) Powered by Discuz! X3.2