跳转到主要内容

模拟时钟

模拟时钟是一个控件,能够显示一个传统的模拟时钟,而不是通过文本显示时间的数字时钟。 该时钟使用背景图像作为钟面。 时针、分针和秒针都使用一幅图像,并围绕一个可配置的中心旋转。

模拟器中运行的模拟时钟(加速镜头)

控件组

模拟时钟位于TouchGFX Designer中的Miscellaneous控件组中。

TouchGFX Designer中的模拟时钟

属性

TouchGFX Designer中模拟时钟的属性。

属性组属性说明
名称控件的名称名称是TouchGFX Designer和代码中使用的唯一标识符
位置XY 指定控件左上角相对于其父的位置。

WH 指定控件的宽度和高度。
模拟时钟的大小是从关联图像的大小获取的,其大小无法更改(除非更改图像)。

锁定指定控件是否应锁定为其当前的X、Y、W和H。
如果锁定控件,还会禁止通过屏幕与控件进行交互。

可见 指定控件的可见性。 如果将控件标记为不可见,还会禁止通过屏幕与控件进行交互。
样式样式 指定控件的预定义设置,用于将所选属性设为预定义的值。
这些样式包含可免费使用的图像
外观图像 指定用作背景的图像。

X轴旋转中心Y轴旋转中心 指定时钟指针应该绕着旋转的点
时间使用Am/Pm指定时间格式是12小时制还是24小时制。

初始时间指定时钟显示的初始时间。
时钟指针时钟指针 指定模拟时钟应该显示哪个时钟指针(秒针、分针和时针)、 以及指针的顺序。
每根时钟指针都可以通过设置旋转位置X旋转位置Y来设置一个指针图像和各自的旋转点。

分针和时针都可选择使用扫描式指针动作,方法是设置扫描式动作
动画动画式时钟指针动作指定是否启用时钟指针的动画效果。

持续时间指定动画效果的持续时间。

缓动缓动选项 指定使用的缓动方程。
Mixin可拖动 指定在运行时控件是否可拖动。

ClickListener 指定控件被点击时是否会调用回调函数。

MoveAnimator 指定控件是否可绘制 XY 值变化的动画。

时间

“时间”属性组允许用户设置时钟控件的初始时间,以及是否使用Am/Pm标准。

选择Am/Pm还会导致代码生成的细微变化。 而不是在模拟时钟中使用下面的函数初始化时间:
initializeTime24Hour(uint8_t hour, uint8_t minute, uint8_t second)

如果采用12小时表示法,将使用以下函数:
initializeTime12Hour(uint8_t hour, uint8_t minute, uint8_t second, bool am)

如要更新时钟显示的时间,可以使用以下函数之一。
setTime24Hour(uint8_t hour, uint8_t minute, uint8_t second)
setTime12Hour(uint8_t hour, uint8_t minute, uint8_t second, bool am)

时钟指针

在“时钟指针”属性组中,用户可以定义要使用的指针及各自的Z轴顺序。 首先定义的指针将呈现在其他指针之上。

时针、分针和秒针

每个指针都需要一幅图像和一个旋转位置。 旋转位置决定已定义的指针图像应该围绕着进行自身旋转的点。

时钟指针属性

时针和分针具有使用“扫动”能力。 启用此选项后,指针将不再从一个位置瞬间跳到另一个位置。

扫动已禁用

扫动已启用

动画

动画部分允许用户定义更高级的指针运动。 然而,如果时针和分针已经启用了“扫动”,它们将没有动画效果。

在下面的例子中,动画持续时间设置为“30”,缓动设置为“Bounce”,并将“Out”作为其缓动选项:

时钟动画示例

交互

下面的部分介绍了模拟时钟支持的操作和触发条件。

操作

标准控件动作说明
移动控件随时间的推移将控件移动到新位置。
隐藏控件隐藏控件(将可见性设置为false)。
显示控件使隐藏的控件可见(将可见性设置为true)。

触发

模拟时钟不会产生任何触发条件。

性能

模拟时钟包括一幅图像和三个纹理映射器,都是MCU资源密集型组件。 因此,在大部分平台上,会将模拟时钟视为要求高的控件。

关于绘图性能的更多信息,请阅读通用UI组件性能部分。

示例

生成代码

在生成的视图基类的代码中,可以查看TouchGFX Designer是如何创建模拟时钟的。

mainViewBase.cpp
#include <gui_generated/main_screen/mainViewBase.hpp>
#include "BitmapDatabase.hpp"

mainViewBase::mainViewBase()
{
analogClock.setXY(124, 15);
analogClock.setBackground(BITMAP_BLUE_CLOCKS_BACKGROUNDS_CLOCK_STANDARD_BACKGROUND_ID, 116, 116);
analogClock.setupMinuteHand(BITMAP_BLUE_CLOCKS_HANDS_CLOCK_STANDARD_MINUTE_HAND_ID, 7, 67);
analogClock.setMinuteHandSecondCorrection(false);
analogClock.setupHourHand(BITMAP_BLUE_CLOCKS_HANDS_CLOCK_STANDARD_HOUR_HAND_ID, 7, 52);
analogClock.setHourHandMinuteCorrection(false);
analogClock.setupSecondHand(BITMAP_BLUE_CLOCKS_HANDS_CLOCK_STANDARD_SECOND_HAND_ID, 3, 66);
analogClock.initializeTime24Hour(10, 10, 0);

add(analogClock);
}

void mainViewBase::setupScreen()
{

}
Tip
可在用户代码中使用这些函数以及AnalogClock类中提供的其他函数。 如果更改控件的外观,请必须调用 analogClock.invalidate() 强制进行重新绘制。

用户代码

下面的例子展示了如何设置时钟动作:

mainView.hpp
#ifndef MAINVIEW_HPP
#define MAINVIEW_HPP

#include <gui_generated/main_screen/mainViewBase.hpp>
#include <gui/main_screen/mainPresenter.hpp>

class mainView : public mainViewBase
{
public:
mainView();
virtual ~mainView() {}
virtual void setupScreen();
virtual void tearDownScreen();
virtual void handleTickEvent();

protected:
int tickCounter;
int analogHours;
int analogMinutes;
int analogSeconds;
};

#endif // MAINVIEW_HPP

mainView.cpp
#include <gui/main_screen/mainView.hpp>

mainView::mainView()
{
}

void mainView::setupScreen()
{
mainViewBase::setupScreen();
analogHours = analogClock.getCurrentHour();
analogMinutes = analogClock.getCurrentMinute();
analogSeconds = analogClock.getCurrentSecond();
}

void mainView::tearDownScreen()
{
mainViewBase::tearDownScreen();
}

void mainView::handleTickEvent()
{
tickCounter++;

if (tickCounter % 60 == 0)
{
if (++analogSeconds >= 60)
{
analogSeconds = 0;
if (++analogMinutes >= 60)
{
analogMinutes = 0;
if (++analogHours >= 24)
{
analogHours = 0;
}
}
}

// Update the clocks
analogClock.setTime24Hour(analogHours, analogMinutes, analogSeconds);
}
}

TouchGFX Designer示例

如需进一步了解模拟时钟,请尝试在TouchGFX Designer中使用以下示例创建新应用:

TouchGFX Designer中的时钟示例

API参考