麦步社区-论坛

标题: 初次修改表盘,分享一下 [打印本页]

作者: klds1991    时间: 2016-8-24 15:29
标题: 初次修改表盘,分享一下
这个表盘主要修改自神盾局特工的表盘。其实之前很喜欢运动天气表盘,无奈在iOS下,经常过一阵子手表就无法从手机那里获取天气,必须打开APP再切换一下表盘才能获取。然后过个一两天就又不行了。索性就不要天气信息,只显示手表本地能够获得的信息好了。然后海拔和楼层我也不是很关心,就一起去掉了,得到了这个表盘。其中右列从上到下为电量、第二时区(个人需求,需要一个第二时区)、温度和步数。个人比较满意的是电量的显示,既有百分比的显示,还调用系统的状态栏显示了电池格数,这样让电池的标志又动态又美观。相应的蓝牙状态也是调用系统状态栏,这里没有显示。
下一步想把第二时区做成从手机端设置的模式,但是有点没看懂怎么从手机获取信息。有哪位能大概讲讲吗?


作者: 不贰小    时间: 2016-8-24 15:32
还不错,看起来挺精致的。
关于自定义表盘这个功能,有看过了卖萌天气等开源源码了吗?
作者: 胸无墨    时间: 2016-8-24 20:33
神盾局特工日期好像不更新,需要切换到其他表盘再切换回来才更新
作者: klds1991    时间: 2016-8-24 21:20
胸无墨 发表于 2016-8-24 20:33
神盾局特工日期好像不更新,需要切换到其他表盘再切换回来才更新

是的,的确存在这个问题,修正起来也很简单。原作者在时间刷新函数里没有写随时间刷新日期和星期的代码,至少在开源版的源码里是这样的。自己加上之后就可以正常更新了。
作者: klds1991    时间: 2016-8-24 21:23
不贰小 发表于 2016-8-24 15:32
还不错,看起来挺精致的。
关于自定义表盘这个功能,有看过了卖萌天气等开源源码了吗? ...

看了卖萌天气的源码,回调函数太多看不明白应该用哪个。能告诉我如果想实现在app里的那个“设置表盘内容”功能该用哪个函数吗?
作者: 胸无墨    时间: 2016-8-24 22:03
klds1991 发表于 2016-8-24 21:20
是的,的确存在这个问题,修正起来也很简单。原作者在时间刷新函数里没有写随时间刷新日期和星期的代码, ...

我不懂编程,只会调整下要素的位置、字体等,能教我随时间刷新日期和星期的代码怎么写么,放在哪一行。谢谢
作者: klds1991    时间: 2016-8-25 09:22
胸无墨 发表于 2016-8-24 22:03
我不懂编程,只会调整下要素的位置、字体等,能教我随时间刷新日期和星期的代码怎么写么,放在哪一行。谢 ...


我发现这个问题已经是修改表盘的后期了,所以改动比较大,无法给你直接能用的代码。不过我可以给你修改的思路,基本上只要对现有代码进行模仿就可以完成, 应该很简单。
第一步是将日期和星期图层给定到它的涂层句柄中。在代码开始的变量声明阶段,新声明两个变量用于日期、星期图层句柄,例如在
  1. static int32_t g_app_mwd_battery_layer_id = -1;
复制代码

后面添加
  1. static int32_t g_app_mwd_week_layer_id = -1;
复制代码

接着,在窗口初始化函数里(P_Window init_mwd_window())将相应图层赋给涂层句柄。例如将
  1. app_window_add_layer(p_window, layer_text_date);
复制代码

修改为
  1. if(layer_battery != NULL)
  2.         {
  3.                 g_app_mwd_battery_layer_id = app_window_add_layer(p_window, layer_battery);
  4.         }
复制代码

的形式。注意是修改为这个形式,请自己替换其中需要替换的变量,不要照抄。
至此,已经可以在别的方法里调用这两个图层了。
第二步是在时间更新方法(app_zola_watch_time_change)里修改日期和星期。
请仿照这个代码,在这个代码后面添加新的代码
  1. P_Layer layer_battery = app_window_get_layer_by_id(p_window, g_app_mwd_battery_layer_id);
  2.                 if (NULL == layer_battery)
  3.                 {
  4.                         return;
  5.                 }
复制代码

这样可以取到表盘的日期和星期图层。然后仿照这个代码
  1. sprintf(str, "%d:%02d", datetime.hour, datetime.min);
  2.                 app_layer_set_text_text(p_hm_layer, str);
复制代码

修改日期、星期表盘的内容。日期、星期的获取方法在窗口初始化方法(P_Window init_mwd_window())里有。这样就能实现日期、星期的更新。
作者: 不贰小    时间: 2016-8-25 09:56
klds1991 发表于 2016-8-24 21:23
看了卖萌天气的源码,回调函数太多看不明白应该用哪个。能告诉我如果想实现在app里的那个“设置表盘内容 ...

需不需要把你加到开发者群里,咨询下大神
作者: 1076964977    时间: 2016-8-25 14:04
其实OS SDK里应该简化很多函数。尤其回调函数会吓着很多人。尤其是因为开发表盘的大多不见得是C高手。
比如取得网址上的内容 写成 char* GetWebString(char* url);
开发者直接调用就可以了。

作者: klds1991    时间: 2016-8-25 15:26
不贰小 发表于 2016-8-25 09:56
需不需要把你加到开发者群里,咨询下大神

已经搞定了。现在问题出在app里不会出现那个“设置表盘内容”的按钮。我把UUID换成双时区表盘的就出现了这个按钮,说明这个东西是编程解决不了的,应该是在开发者平台里设置的。嘛,现在这样披着羊皮也能用了。
作者: klds1991    时间: 2016-8-25 20:47
1076964977 发表于 2016-8-25 14:04
其实OS SDK里应该简化很多函数。尤其回调函数会吓着很多人。尤其是因为开发表盘的大多不见得是C高手。
比如 ...

我倒是觉得函数简化不是问题。文档写的太不清楚才是问题。有时候看那个API文档也看不明白。
作者: 胸无墨    时间: 2016-8-26 10:59
klds1991 发表于 2016-8-25 09:22
我发现这个问题已经是修改表盘的后期了,所以改动比较大,无法给你直接能用的代码。不过我可以给你修改的 ...

谢谢你费这么大的功夫给我指导,但我没半点基础,还是搞不定,能把你的这个源代码给我吗,我在你这个基础上改成符合自己用的表盘
作者: klds1991    时间: 2016-8-26 14:23
本帖最后由 klds1991 于 2016-8-26 14:28 编辑
胸无墨 发表于 2016-8-26 10:59
谢谢你费这么大的功夫给我指导,但我没半点基础,还是搞不定,能把你的这个源代码给我吗,我在你这个基础 ...

好吧。我把神盾局的源代码改了一下,你编译一下,应该就可以了。没空实机测试,在模拟器里改系统日期是没有问题的,会跟着变。我自己的表盘还在迭代中,就不给你了。 watchface_hm.c.zip (4.42 KB, 下载次数: 292)

作者: 胸无墨    时间: 2016-8-26 14:38
klds1991 发表于 2016-8-26 14:23
好吧。我把神盾局的源代码改了一下,你编译一下,应该就可以了。没空实机测试,在模拟器里改系统日期是没 ...

谢谢!收到
作者: 大王1989    时间: 2016-8-26 17:11
这是大黑吗?不错
作者: dustin134    时间: 2016-8-26 22:17
klds1991 发表于 2016-8-25 09:22
我发现这个问题已经是修改表盘的后期了,所以改动比较大,无法给你直接能用的代码。不过我可以给你修改的 ...

很高深的样子,为什么先要图层、为什么要句柄呢
作者: dustin134    时间: 2016-8-26 22:23
klds1991 发表于 2016-8-25 09:22
我发现这个问题已经是修改表盘的后期了,所以改动比较大,无法给你直接能用的代码。不过我可以给你修改的 ...

高手啊。            
作者: klds1991    时间: 2016-8-26 23:35
dustin134 发表于 2016-8-26 22:17
很高深的样子,为什么先要图层、为什么要句柄呢

简单来说是因为创建图层和刷新图层不在一个函数里完成。麦步表盘上的所有元素都是一个个图层组成的,这些图层一般是在表盘初始化的时候创建的。一般而言创建之后的图层在别的函数比如刷新时间的函数里是访问不到的,麦步的做法是给每一个图层ID,也就是句柄,然后在其他函数里可以通过ID来获取需要的图层。神盾局表盘在表盘初始化的时候没有给星期和日期表盘一个ID,所以如果想刷新这两个图层必须添加这部分内容。不知道说的是不是清楚?
作者: dustin134    时间: 2016-8-27 10:59
本帖最后由 dustin134 于 2016-8-27 11:07 编辑
klds1991 发表于 2016-8-26 23:35
简单来说是因为创建图层和刷新图层不在一个函数里完成。麦步表盘上的所有元素都是一个个图层组成的,这些 ...

多些指导!也就是说刷新某表盘元素就得先刷新对应的图层,但想刷新图层必须要获得句柄才行,您看我说的额对吗?我也想改一个自己喜欢的表盘呢
static int32_t g_app_mwd_week_layer_id = -1;
为什么要等于-1呢?

作者: dustin134    时间: 2016-8-27 11:02
klds1991 发表于 2016-8-26 14:23
好吧。我把神盾局的源代码改了一下,你编译一下,应该就可以了。没空实机测试,在模拟器里改系统日期是没 ...

此外,您带刻度的电量显示是如何做到的呢,我想把手头的表盘改成跟你一样可以变化的电量刻度
作者: klds1991    时间: 2016-8-27 11:49
dustin134 发表于 2016-8-27 10:59
多些指导!也就是说刷新某表盘元素就得先刷新对应的图层,但想刷新图层必须要获得句柄才行,您看我说的额 ...

等于-1是初始化时候随便给的,你给0也行。在表盘初始化的时候都会重新赋值的。刻度电量是SDK自带的状态栏里的,可以看一下API文档里的介绍。要达到我这个效果,你需要先添加你的表盘背景,然后添加状态栏,然后添加百分比电量图层,这样百分比电量可以覆盖在状态栏上,就是这个效果。否则状态栏是一整个条,会把其他东西覆盖掉
作者: dustin134    时间: 2016-8-27 17:03
klds1991 发表于 2016-8-27 11:49
等于-1是初始化时候随便给的,你给0也行。在表盘初始化的时候都会重新赋值的。刻度电量是SDK自带的状态 ...

菜鸟听起来好复杂,以后多多向您请教了
作者: dustin134    时间: 2016-8-27 20:56
klds1991 发表于 2016-8-27 11:49
等于-1是初始化时候随便给的,你给0也行。在表盘初始化的时候都会重新赋值的。刻度电量是SDK自带的状态 ...

背景-状态栏-还要图层,晕,这么复杂,是不是背景、状态栏、还有图层都有大小和尺寸的要求?
作者: klds1991    时间: 2016-8-27 22:10
dustin134 发表于 2016-8-27 20:56
背景-状态栏-还要图层,晕,这么复杂,是不是背景、状态栏、还有图层都有大小和尺寸的要求? ...

背景和图层在创建的时候会声明尺寸。状态栏是固定的,不能自己改大小。
作者: dustin134    时间: 2016-8-27 22:49
klds1991 发表于 2016-8-27 22:10
背景和图层在创建的时候会声明尺寸。状态栏是固定的,不能自己改大小。 ...

嗯,我正在慢慢熟悉消化ing
作者: dualxu    时间: 2016-8-28 08:27
klds1991 发表于 2016-8-26 23:35
简单来说是因为创建图层和刷新图层不在一个函数里完成。麦步表盘上的所有元素都是一个个图层组成的,这些 ...

行家呀 这些都应该是开发文档里面应该说明白的问题
作者: dustin134    时间: 2016-8-28 10:28
dualxu 发表于 2016-8-28 08:27
行家呀 这些都应该是开发文档里面应该说明白的问题

可惜文档里没说明白
作者: dustin134    时间: 2016-8-28 18:30
klds1991 发表于 2016-8-27 22:10
背景和图层在创建的时候会声明尺寸。状态栏是固定的,不能自己改大小。 ...

天气请求和城市请求都快把我弄晕了,在缤纷多显程序里面,我整理出来的次序如下,对吗?
先请求城市数据回调——请求天气——请求城市数据——天气数据回调,这几个的关系都把我弄晕了
麦步API中函数void maibu_comm_register_web_callback(CBCommWeb web_callback)中的参数(CBCommWeb web_callback,程序里这个函数的参数却为何是weather_info_callback,而weather_info_callback本身不就是天气回调函数吗?
作者: klds1991    时间: 2016-8-29 09:24
dustin134 发表于 2016-8-28 18:30
天气请求和城市请求都快把我弄晕了,在缤纷多显程序里面,我整理出来的次序如下,对吗?
先请求城市数据 ...

我没研究过天气请求,不过大概知道你说的是什么意思。麦步的回调是这样的,它的回调声明是一个形如F(x)的函数,F就是这里的所谓maibu_comm_register_web_callback,x是一个你自己定义的函数,文档中用的是web_callback。但是这个函数名是自己定义的,同时你在声明了这个回调之后,你需要在程序的其他部分实现x函数。比如在缤纷多显里,它声明回调中调用的函数是weather_info_callback,你应该在程序的其他部分能够找到weather_info_callback的实现部分,而不是有一个现成的API叫做weather_info_callback
作者: dustin134    时间: 2016-8-29 10:16
klds1991 发表于 2016-8-29 09:24
我没研究过天气请求,不过大概知道你说的是什么意思。麦步的回调是这样的,它的回调声明是一个形如F(x)的 ...

多谢,您能讲一下回调函数和申请函数(比如天气或城市)的作用和区别吗?
作者: klds1991    时间: 2016-8-29 12:06
dustin134 发表于 2016-8-29 10:16
多谢,您能讲一下回调函数和申请函数(比如天气或城市)的作用和区别吗? ...

没研究过这些。这些天气功能在iOS上都不稳定,经常断开,所以我把这些全都去掉了,所以也没有研究。
作者: dustin134    时间: 2016-8-29 14:53
klds1991 发表于 2016-8-29 12:06
没研究过这些。这些天气功能在iOS上都不稳定,经常断开,所以我把这些全都去掉了,所以也没有研究。 ...

嗯,总之对我帮助很大,再次感谢
作者: dustin134    时间: 2016-8-29 15:52
本帖最后由 dustin134 于 2016-8-29 15:53 编辑
klds1991 发表于 2016-8-29 12:06
没研究过这些。这些天气功能在iOS上都不稳定,经常断开,所以我把这些全都去掉了,所以也没有研究。 ...

你好,我看了缤纷多显的程序有一个疑问,我之前开发单片机软件,都是设定一个TIMER,这个定时器定时产生中断,这时就可以在该定时器中断中加入处理程序,在main()中加入死循环,这样就可以使之不停的运转,可是在麦步程序中并没有看见这样的机制,应该是执行一遍就OVER了,如何做到定时刷新程序的呢?比如说定时刷新步数、天气、等等数据
作者: dustin134    时间: 2016-8-29 17:11
本帖最后由 dustin134 于 2016-8-29 22:19 编辑
klds1991 发表于 2016-8-29 12:06
没研究过这些。这些天气功能在iOS上都不稳定,经常断开,所以我把这些全都去掉了,所以也没有研究。 ...

//注册定时查询函数
      此问题已经清楚了
作者: dustin134    时间: 2016-8-29 22:16
klds1991 发表于 2016-8-29 12:06
没研究过这些。这些天气功能在iOS上都不稳定,经常断开,所以我把这些全都去掉了,所以也没有研究。 ...

1、你的神盾局程序里定的定时器每200ms触发app_timer_change事件,意思是只执行app_timer_change吧,
2、此外,P_Window init_mwd_window()函数多长时间更新一次呢,或者只是表盘一开始运行一次,但是我看你app_timer_change函数中更新的数据不全吧,比如高度、气压、步数、电量都在哪个函数里更新呢?
3、我没找到你程序里关于带刻度的电量图片是如何建立图层并显示的(可能我被电量百分比搞混了)
问题比较多,多谢啦

作者: klds1991    时间: 2016-8-30 08:46
dustin134 发表于 2016-8-29 22:16
1、你的神盾局程序里定的定时器每200ms触发app_timer_change事件,意思是只执行app_timer_change吧,
2、 ...

是这样的。我发给你的是我把神盾局表盘修改了日期和星期刷新之后的版本,并不是我自己的表盘文件。在神盾局表盘里,app_timer_change只负责刷新蓝牙状态之类的少数数据,大部分数据实在另一个函数里每分钟刷新一次的。
init_mwd_window是表盘初始化时候运行,只运行一次。大部分数据刷新在app_zola_watch_time_change里面。是通过注册maibu_service_sys_event_subscribe(app_zola_watch_time_change);回调实现的。
电量图层在源代码里有,只是被注释掉了。你可以找app_plug_status_bar_create(p_window, NULL, NULL, NULL);开头的四句,就是负责生成状态栏、时间、电量、蓝牙的
作者: dustin134    时间: 2016-8-30 10:52
klds1991 发表于 2016-8-30 08:46
是这样的。我发给你的是我把神盾局表盘修改了日期和星期刷新之后的版本,并不是我自己的表盘文件。在神盾 ...

再次感谢:handshake
作者: dustin134    时间: 2016-8-30 11:19
klds1991 发表于 2016-8-30 08:46
是这样的。我发给你的是我把神盾局表盘修改了日期和星期刷新之后的版本,并不是我自己的表盘文件。在神盾 ...

   maibu_service_sys_event_subscribe(time_change);
        /*注册接受手机数据回调函数*/
        maibu_comm_register_phone_callback(get_city_info_callback);
        
        /*注册通讯结果回调*/
    maibu_comm_register_result_callback(weather_comm_result_callback);
        
        uint32_t request_time = 15*60*1000;//默认15分钟请求数据
               
        //是安装表盘的情况,则记录时间,并设置快速查询
        if(g_start_seconds_flag == 0)
        {
                struct date_time tt1;
                app_service_get_datetime(&tt1);
                g_start_seconds = app_get_time(&tt1);
               
                request_time = 5 * 1000;//在没有获取过数据的情况下5秒获取一次数据
                g_callback_request_flag = 1;//设置快速查询标志
                        
        }
        g_start_seconds_flag = 1;

        time_change(SysEventTypeTimeChange,NULL);
        
        //判断是否距离上次成功获得数据超过5分钟
        if(get_time_out_flag(5)||(g_weather_bmp_key == -1))
        {
                //请求GPS数据并注册GPS数据请求超时回调
                request_get_city_info();
               
        }

上面一堆回调函数,比如maibu_service_sys_event_subscribe(time_change);、maibu_comm_register_result_callback(weather_comm_result_callback);以及maibu_comm_register_result_callback(weather_comm_result_callback);等,这些都是由下面15分钟定时器决定进行刷新数据的吗?主要是跟我以前编程内容差别太大,不好理解
作者: klds1991    时间: 2016-8-30 12:58
dustin134 发表于 2016-8-30 11:19
maibu_service_sys_event_subscribe(time_change);
        /*注册接受手机数据回调函数*/
        mai ...

并不都是15分钟。这个刷新是调用的app_service_timer_subscribe(request_time, app_weather_update_timer_callback, NULL)。在main里这个只调用了一次,而在app_weather_update_timer_callback方法里这个是重复调用的,也就是在app_weather_update_timer_callback里决定了刷新的频率。刷新频率会根据刷新的结果进行调整,也就是app_service_timer_subscribe((30-(15*get_front_or_back_flag()))*60*1000, app_weather_update_timer_callback, NULL)
作者: dustin134    时间: 2016-8-30 13:07
klds1991 发表于 2016-8-30 12:58
并不都是15分钟。这个刷新是调用的app_service_timer_subscribe(request_time, app_weather_update_timer ...

这回清楚了,我都觉得自己太笨了
作者: klds1991    时间: 2016-8-30 13:47
dustin134 发表于 2016-8-30 13:07
这回清楚了,我都觉得自己太笨了

不是你笨。是文档没写清楚。
作者: dustin134    时间: 2016-8-30 14:13
klds1991 发表于 2016-8-30 13:47
不是你笨。是文档没写清楚。

又有新问题了,appinfo.json这个文件,我用记事本打开改动保存后,编译提示这个文件错误咋回事
作者: klds1991    时间: 2016-8-30 14:27
dustin134 发表于 2016-8-30 14:13
又有新问题了,appinfo.json这个文件,我用记事本打开改动保存后,编译提示这个文件错误咋回事 ...

这个就真的不知道了==检查一下符号是不是用了中文的?
作者: dustin134    时间: 2016-8-30 15:50
klds1991 发表于 2016-8-30 14:27
这个就真的不知道了==检查一下符号是不是用了中文的?

/*注册接受手机数据回调函数*/
         maibu_comm_register_phone_callback(get_city_info_callback);

这个回调函数注册有何意义呢?API里面的说明太简单了,“注册请求或接受手机数据或控制手机某些功能的回调”
get_city_info_callback这个函数在缤纷多显里面是查询城市和天气的作用
作者: niuniumm    时间: 2016-9-10 07:28
淡定,淡定,淡定……

作者: 王小健    时间: 2016-12-25 08:44
dustin134 发表于 2016-8-30 14:13
又有新问题了,appinfo.json这个文件,我用记事本打开改动保存后,编译提示这个文件错误咋回事 ...

新手看帖中,这个看其他帖有解,用Notepad++编辑保存应该能解决,估计你已经解决了,呵呵




欢迎光临 麦步社区-论坛 (http://203.195.186.190/) Powered by Discuz! X3.2