本帖最后由 数码小叶 于 2022-9-11 10:20 编辑
上一篇使用进度条来实现温度的动态显示,这里还缺少了第一屏和第二屏的数据交互
第一屏,负责设置温度和湿度的阈值,由上下触摸按键负责调整数值,保存键负责保存数据,可以不用保存键,在上下键按得同时保存数据,但这样如果设置错误想撤销就得再次调整了,所以还是加了保存按键
第二屏负责显示温度,设置键可以跳转到第一屏设置阈值,并且可以获取第一屏设置的阈值,再将获取到的温度值、湿度值和阈值进行比较,如果超过阈值,就改变数值和线性进度条的颜色为红色。
在第四篇中,采用的是MVP模型来显示数据,因此,这个数据交互也得遵循这个规则。对于MVP模型,每一时刻,只有1个SCREEN处于活跃状态,在SCREEN不处于活跃状态时,其值就被释放了。因此想要第二屏获取到它的数据,就得把数值保留下来,途径就是使用MVP的Model类,因为Model类始终处于活跃状态,在Model类中定义要保存的数据以及保存操作
int16_t wenduSetting;
int16_t shiduSetting;
void savewenduSetting(int16_t savewenduSetting)
{
wenduSetting = savewenduSetting;
}
void saveshiduSetting(int16_t saveshiduSetting)
{
shiduSetting = saveshiduSetting;
}
然后每次在保存键按下时,就去执行保存操作,在screen1view中调用
virtual void buttonSavewenduClicked()
{
presenter->savewenduSetting(wenduSetting);
}
virtual void buttonSaveshiduClicked()
{
presenter->saveshiduSetting(shiduSetting);
}
第二屏要获取数值,就得再有个获取操作,这样在View类中就可以调用了
int16_t getwenduSetting()
{
return model->getwenduSetting();
}
int16_t getshiduSetting()
{
return model->getshiduSetting();
}
int16_t getwenduSetting()
{
return wenduSetting;
}
int16_t getshiduSetting()
{
return shiduSetting;
}
虽然这样已经可以完整的实现了上一篇的效果,达到两个屏通过Model类实现数据交互,但是,此时,仔细观察屏幕会发现几个问题:
第二屏载入时,先是先是显示设置的默认值,再去显示获取到的温度值,第三步才是显示的阈值比较结果;
第一屏载入时,显示也是先显示初始值,再去显示上次设置的阈值;
这就是没考虑到两个屏的数据同步初始化问题,在两个屏幕载入时,为了直接达到显示结果的目的,应该在开始的时候就获取值,要获取值,就得保存值,相当于多了一个屏幕状态的保存。
wenduSetting = presenter->getwenduSetting();
shiduSetting = presenter->getshiduSetting();
在screen1view和screen2view载入的时候,分别调用get方法来载入上次的保存值,就是在setupScreen方法中调用,这样,在屏幕来回切换时,就没有好几步的中断感觉了
wenduAlarm = presenter->getwenduSetting();
shiduAlarm = presenter->getshiduSetting();
lastwendu = presenter->getwendu();
lastshidu = presenter->getshidu();
最后视频显示效果:
为了对比,线性进度条只对颜色和阈值比较结果进行了同步,没有对数值进行同步,可以看到,每词切换载入时,其值要增减一次,而其它的数据显示,在进行了同步操作后,切换屏幕,数据显示没有任何跳变发生。
|