多屏应用

在本教程中,您将学习如何在应用程序中创建多个屏幕以及如何在两个屏幕之间共享数据。我们将创建一个模拟时钟的应用程序,它将使用一个屏幕设置小时和分钟,并将设置的时间传递给另一个带有运行时钟的屏幕。

您还将学习如何使用TouchGFX Designer根据交互(例如屏幕更改)创建动画。

可以从此链接下载本教程中将使用的图像  将文件解压缩到磁盘上的目录。

设置屏幕1

创建的第一个屏幕是Screen1,它是可以设置小时和分钟并将其与运行时钟一起发送到屏幕的屏幕。屏幕1如下所示,其中包含两个文本框,其中包含所需的时钟时间。要调整框中的值,请使用向上和向下箭头。为了保存所选值并将其传递到时钟上,使用了相应框下方的保存按钮。最后,通过按时钟按钮,随时钟切换到Screen2。

插入背景和文本区域的操作如下图和表格所示。

backgroundAndText.png

屏幕1的屏幕快照,突出显示了背景的位置和文本区域

 

位置 小部件 物产
1个 图片
  • 名称:背景
  • 位置:
    • X:0,Y:0
  • 图片:background_Screen1.png
2 文字区 
  • 名称:textAreaHourCaption
  • 位置:
    • X:86,Y:46
    • 宽:85,高:24
  • 文本:     
    • 文字:小时
    • 版式:20px
    • 对齐方式:居中
  • 出现:
    • 颜色:#FFABABAB
 3  文字区
  • 名称:textAreaHour
  • 位置:
    • X:87,Y:70
    • 宽:83,高:50
  • 文本:
    • 文字:<值>
    • 通配符1:
      • 初始值:00
      • 缓冲区大小:3
    • 版式:40px
    • 对齐方式:居中
  • 出现:
    • 颜色:#FFABABAB
4 文字区 
  • 名称:textAreaMinuteCaption
  • 位置:
    • X:309,Y:46
    • 宽:85,高:24
  • 文本:     
    • 文字:分钟
    • 版式:20px
    • 对齐方式:居中
  • 出现:
    • 颜色:#FFABABAB
5 文字区
  • 名称:textAreaMinute
  • 位置:
    • X:311,Y:70
    • 宽:83,高:50
  • 文本:
    • 文字:<值>
    • 通配符1:
      • 初始值:00
      • 缓冲区大小:3
    • 版式:40px
    • 对齐方式:居中
  • 出现:
    • 颜色:#FFABABAB

这些按钮将插入到应用程序中,如下图和表所示。

Buttons.png

屏幕1的屏幕快照,突出显示了按钮的位置

 

位置 小部件 物产
1个 纽扣
  • 名称:buttonHourUp
  • 位置:
    • X:184,Y:51
  • 图片:
    • 发行图片:Up_arrow.png
    • 按下的图片:Up_arrow_pressed.png
2 纽扣
  • 名称:buttonHourDown
  • 位置:
    • X:184,Y:93
  • 图片:
    • 发行图片:Down_arrow.png
    • 按下的图片:Down_arrow_pressed.png
3 纽扣
  • 名称:buttonMinuteUp
  • 位置:
    • X:266,Y:51
  • 图片:
    • 发行图片:Up_arrow.png
    • 按下的图片:Up_arrow_pressed.png
4 纽扣
  • 名称:buttonMinuteDown
  • 位置:
    • X:266,Y:93
  • 图片:
    • 发行图片:Down_arrow.png
    • 按下的图片:Down_arrow_pressed.png
5 带标签的按钮
  • 名称:buttonSaveHour
  • 位置:
    • X:80,Y:137
  • 文本:
    • 文字:保存
    • 版式:25px
    • 对齐方式:居中
  • 文字外观
    • 发行颜色:#FF424242
    • 压色:#FFA6A6A6
  • 图片:
    • 发行图片:btn_round.png
    • 按下图片:btn_round_pressed.png
6 带标签的按钮
  • 名称:buttonSaveMinute
  • 位置:
    • X:303,Y:137
  • 文本:
    • 文字:保存
    • 版式:25px
    • 对齐方式:居中
  • 文字外观
    • 发行颜色:#FF424242
    • 压色:#FFA6A6A6
  • 图片:
    • 发行图片:btn_round.png
    • 按下图片:btn_round_pressed.png
7 带标签的按钮
  • 名称:buttonClock
  • 位置:
    • X:192,Y:204
  • 文本:
    • 文字:时钟
    • 版式:25px
    • 对齐方式:居中
  • 文字外观
    • 发行颜色:#FF424242
    • 压色:#FFA6A6A6
  • 图片:
    • 发行图片:btn_round.png
    • 按下图片:btn_round_pressed.png

通过设置图形元素,下一步是添加按钮的触发器,按钮将调整所选值并保存它们:

相互作用 物产

单击小时增加按钮

  • 触发器:单击按钮
  • 单击源:buttonHourUp
  • 行动:调用新的虚拟功能
  • 函数名称:buttonHourUpClicked
单击小时减少按钮
  • 触发器:单击按钮
  • 单击源:buttonHourDown
  • 行动:调用新的虚拟功能
  • 函数名称:buttonHourDownClicked
单击分钟向上按钮  
  • 触发器:单击按钮
  • 单击源:buttonMinuteUp
  • 行动:调用新的虚拟功能
  • 函数名称:buttonMinuteUpClicked
单击分钟向下按钮  
  • 触发器:单击按钮
  • 单击源:buttonMinuteDown
  • 行动:调用新的虚拟功能
  • 函数名称:buttonMinuteDownClicked
单击“节省时间”按钮  
  • 触发器:单击按钮
  • 单击源:buttonSaveHour
  • 行动:调用新的虚拟功能
  • 函数名称:buttonSaveHourClicked
单击“保存分钟”按钮  
  • 触发器:单击按钮
  • 单击源:buttonSaveMinute
  • 行动:调用新的虚拟功能
  • 函数名称:buttonSaveMinuteClicked

利用设计人员生成的虚拟功能,我们首先集成了箭头按钮的四个功能。为了跟踪小时和分钟的值,还添加了两个计数器。

因此,以下代码应添加到Screen1View.hpp

	
	
	

Screen1View.hpp

... public: ... virtual void buttonHourUpClicked(); virtual void buttonHourDownClicked(); virtual void buttonMinuteUpClicked(); virtual void buttonMinuteDownClicked(); protected: int16_t hour; int16_t minute; ...

当按下箭头时,相应的值将更改为适合时钟的值。

应当以以下方式添加这四个功能的逻辑。

	
	
	

Screen1View.cpp

... void Screen1View::buttonHourUpClicked() { hour = (hour + 1) % 24; // Keep new value in range 0..23 Unicode::snprintf(textAreaHourBuffer, TEXTAREAHOUR_SIZE, "%02d", hour); textAreaHour.invalidate(); } void Screen1View::buttonHourDownClicked() { hour = (hour + 24 - 1) % 24; // Keep new value in range 0..23 Unicode::snprintf(textAreaHourBuffer, TEXTAREAHOUR_SIZE, "%02d", hour); textAreaHour.invalidate(); } void Screen1View::buttonMinuteUpClicked() { minute = (minute + 1) % 60; // Keep new value in range 0..59 Unicode::snprintf(textAreaMinuteBuffer, TEXTAREAMINUTE_SIZE, "%02d", minute); textAreaMinute.invalidate(); } void Screen1View::buttonMinuteDownClicked() { minute = (minute + 60 - 1) % 60; // Keep new value in range 0..59 Unicode::snprintf(textAreaMinuteBuffer, TEXTAREAMINUTE_SIZE, "%02d", minute); textAreaMinute.invalidate(); }

设置屏幕2

第二个屏幕Screen2是运行时钟的放置位置,从Screen1中保存的值开始。除时钟外,Screen2还包含一个围绕时钟动画的圆圈,表示时钟正在运行。最后,要返回到Screen1,将执行一个按钮,将屏幕更改为Screen1。

img_20181106_104628_28.png

使用模拟器运行应用程序时的“ screen2”屏幕截图

在将元素添加到Screen2之前,必须创建一个新屏幕。这是通过TouchGFX Designer中的添加屏幕按钮完成的,如下图所示。

TouchGFX Designer中添加屏幕按钮的位置

当进入“ screen2”时,时钟和动画都通过进入视图而动画到其位置,时钟从左侧移入,圆圈从右侧移入。因此,这两个小部件最初放在TouchGFX Designer中的画布外部。

窗口小部件的放置应按照下面的图片和表格进行。

screen2Location.png

Wigets在“ screen2”中的位置

位置 小部件 物产
1个 图片
  • 名称:背景
  • 位置:
    • X:0,Y:0
  • 图片:background_Screen2.png
2 纽扣
  • 名称:buttonSettings
  • 位置:
    • X:422,Y:10
  • 图片:
    • 发布的图片:configuration.png
    • 按下的图片:configuration.png
 3  文字区
  • 名称:textClock
  • 位置:
    • X:-156,Y:109
    • 宽:156,高:54
  • 文本:
    • 文字:<小时>:<分钟>
    • 通配符1:
      • 初始值:00
      • 缓冲区大小:3
    • 通配符2:
      • 初始值:00
      • 缓冲区大小:3
    • 版式:40px
    • 对齐方式:居中
  • 出现:
    • 颜色:#FFBABABA
4
  • 名称:圆
  • 位置:
    • X:479,Y:36
    • 宽:200,高:200
  • 图像和颜色:     
    • 颜色:#FFBABABA
  • 出现:
    • 中心位置:
      • X:100,Y:100
    • 开始和结束角度:
      • 开始:0,结束:180
    • 半径:72
    • 线宽:6
    • 瓶盖样式:三角形

在屏幕之间切换

屏幕1上的时钟按钮和屏幕2上的配置按钮需要交互才能切换屏幕。此外,输入Screen2时,需要将放置在Screen2上屏幕区域之外的两个元素移动到位。

将以下交互添加到Screen1:

相互作用 物产

“更改为Screen2”

  • 触发器:单击按钮
  • 单击源:buttonClock
  • 行动:更改屏幕
  • 屏幕:Screen2
  • 过渡:封面
  • 转换方向:北

还将以下交互添加到Screen2:

相互作用 物产

更改为“ Screen1”

  • 触发器:单击按钮
  • 单击的源:buttonSettings
  • 行动:更改屏幕
  • 屏幕:Screen1
  • 过渡:幻灯片
  • 过渡方向:南

将圆移到位

  • 触发:进入屏幕
  • 行动:移动小部件
  • 要移动的小部件:圆圈
  • 位置:140、36
  • 缓和:三次,输出
  • 持续时间:750ms

将文字时钟移到位

  • 触发:进入屏幕
  • 行动:移动小部件
  • 要移动的小部件:textClock
  • 位置:162、109
  • 缓和:三次,输出
  • 持续时间:750ms

要在运行时更新时钟并为圆圈设置动画,请handleTickEvent 使用虚拟功能  

handleTickEvent 由TouchGFX框架定期调用,使它能够动态更新活动屏幕中的元素,在这种情况下将是时钟和循环。 

类似于Screen1,一个小时和一个分钟的计数器用于跟踪时钟。由于  handleTickEvent 调用频率比应更新的时钟频率高,因此添加了tickCounter来确定时钟更新之间的滴答声数量。为了更新圆弧的角度,使用了addStart和addEnd函数。handleTickEvent 如下所示,函数和变量添加到Screen2View.hpp中。

	
	
	

Screen2View.hpp

public: ... virtual void handleTickEvent(); protected: int16_t hour; int16_t minute; int16_t tickCount; int16_t addStart; int16_t addEnd; ...

集成handleTickEventScreen2View.cpp,从而更新时钟和圆圈的代码如下所示

	
	
	

Screen2View.hpp

... void Screen2View::handleTickEvent() { if (tickCount == 60) { minute++; hour = (hour + (minute / 60)) % 24; minute %= 60; Unicode::snprintf(textClockBuffer1, TEXTCLOCKBUFFER1_SIZE, "%02d", hour); Unicode::snprintf(textClockBuffer2, TEXTCLOCKBUFFER2_SIZE, "%02d", minute); textClock.invalidate(); tickCount = 0; } if (!textClock.isMoveAnimationRunning()) { tickCount++; if (circle.getArcStart() + 340 == circle.getArcEnd()) { addStart = 2; addEnd = 1; } else if (circle.getArcStart() + 20 == circle.getArcEnd()) { addStart = 1; addEnd = 2; } circle.invalidate(); circle.setArc(circle.getArcStart() + addStart, circle.getArcEnd() + addEnd); circle.invalidate(); } }