TouchGFX之时钟

news2024/11/28 2:29:17

代码

#ifndef TOUCHGFX_ABSTRACTCLOCK_HPP
#define TOUCHGFX_ABSTRACTCLOCK_HPP
#include <touchgfx/containers/Container.hpp>
#include <touchgfx/hal/Types.hpp>

namespace touchgfx
{
class AbstractClock : public Container
{
public:
	AbstractClock();

	/* 设置24小时制时间 */
	virtual void setTime24Hour(uint8_t hour, uint8_t minute, uint8_t second);

	/* 设置12小时制时间 */
	virtual void setTime12Hour(uint8_t hour, uint8_t minute, uint8_t second, bool am);

	/* 获取当前小时 */
	uint8_t getCurrentHour() const;

	/* 获取当前24小时制时 */
	uint8_t getCurrentHour24() const;

	/* 获取当前12小时制时 */
	uint8_t getCurrentHour12() const;

	/* 获取上午/下午 */
	bool getCurrentAM() const;

	/* 获取当前分钟 */
	uint8_t getCurrentMinute() const;

	/* 获取当前秒 */
	uint8_t getCurrentSecond() const;

protected:
	uint8_t currentHour;   //当前小时
	uint8_t currentMinute; //当前分钟
	uint8_t currentSecond; //当前秒

	/* 更新时钟 */
	virtual void updateClock() = 0;
};

}

#endif

touchgfx提供的几种时钟
1.AnalogClock
#ifndef TOUCHGFX_ANALOGCLOCK_HPP
#define TOUCHGFX_ANALOGCLOCK_HPP
#include <touchgfx/Bitmap.hpp>
#include <touchgfx/EasingEquations.hpp>
#include <touchgfx/containers/clock/AbstractClock.hpp>
#include <touchgfx/hal/Types.hpp>
#include <touchgfx/widgets/AnimationTextureMapper.hpp>
#include <touchgfx/widgets/Image.hpp>
#include <touchgfx/widgets/TextureMapper.hpp>

namespace touchgfx
{
class AnalogClock : public AbstractClock
{
public:
	AnalogClock();

	/* 设置背景位图 */
	virtual void setBackground(const BitmapId backgroundBitmapId);

	/* 设置背景位图和中心旋转点 */
	virtual void setBackground(const BitmapId backgroundBitmapId, int16_t rotationCenterX, int16_t rotationCenterY);

	/* 设置中心旋转点 */
	virtual void setRotationCenter(int16_t rotationCenterX, int16_t rotationCenterY);

	/* 设置小时位图 */
	virtual void setupHourHand(const BitmapId hourHandBitmapId, int16_t rotationCenterX, int16_t rotationCenterY);

	/* 设置分钟位图 */
	virtual void setupMinuteHand(const BitmapId minuteHandBitmapId, int16_t rotationCenterX, int16_t rotationCenterY);

	/* 设置秒位图 */
	virtual void setupSecondHand(const BitmapId secondHandBitmapId, int16_t rotationCenterX, int16_t rotationCenterY);

	/* 设置分改变的时候是否更新时针角度 */
	virtual void setHourHandMinuteCorrection(bool active);

	/* 获取分改变的时候是否更新时针角度 */
	virtual bool getHourHandMinuteCorrection() const;

	/* 设置秒改变的时候是否更新分针角度 */
	virtual void setMinuteHandSecondCorrection(bool active);

	/* 获取秒改变的时候是否更新分针角度 */
	virtual bool getMinuteHandSecondCorrection() const;

	/* 设置动画属性 */
	virtual void setAnimation(uint16_t duration = 10, EasingEquation animationProgressionEquation = EasingEquations::backEaseInOut);

	/* 获取动画时间 */
	virtual uint16_t getAnimationDuration()
	{
		return animationDuration;
	}

	/* 初始化24小时制时间 */
	virtual void initializeTime24Hour(uint8_t hour, uint8_t minute, uint8_t second);

	/* 初始化12小时制时间 */
	virtual void initializeTime12Hour(uint8_t hour, uint8_t minute, uint8_t second, bool am);

	/* 设置透明度 */
	virtual void setAlpha(uint8_t newAlpha);

	/* 获取透明度 */
	virtual uint8_t getAlpha() const;

	/* 重绘 */
	virtual void invalidateContent() const
	{
		if (getAlpha() > 0)
		{
			AbstractClock::invalidateContent();
		}
	}

protected:
	Image background; //背景

	AnimationTextureMapper hourHand;   //时针图像
	AnimationTextureMapper minuteHand; //分针图像
	AnimationTextureMapper secondHand; //秒针图像

	EasingEquation animationEquation; //动画方程式
	uint16_t animationDuration;       //动画持续时间

	int16_t clockRotationCenterX; //旋转点X坐标
	int16_t clockRotationCenterY; //旋转点Y坐标

	uint8_t lastHour;   //最新小时数
	uint8_t lastMinute; //最新分钟数
	uint8_t lastSecond; //最新秒数

	bool hourHandMinuteCorrectionActive;   //分改变是否更新时针
	bool minuteHandSecondCorrectionActive; //秒改变是否更新分针

	virtual void updateClock();

	/**
	 * Sets up a given the hand.
	 *
	 * @param [in] hand            Reference to the hand being setup.
	 * @param      bitmapId        The bitmap identifier for the given hand.
	 * @param      rotationCenterX The hand rotation center x coordinate.
	 * @param      rotationCenterY The hand rotation center y coordinate.
	 */
	virtual void setupHand(TextureMapper& hand, const BitmapId bitmapId, int16_t rotationCenterX, int16_t rotationCenterY);

	/**
	 * Convert hand value to angle.
	 *
	 * @param  steps           Number of steps the primary hand value is divided into, i.e.
	 *                         60 for minutes/seconds and 12 for hour.
	 * @param  handValue       The actual value for the hand in question (in the range [0;
	 *                         steps]).
	 * @param  secondHandValue (Optional) If the angle should be corrected for a secondary
	 *                         hand its value should be specified here (in the range [0;
	 *                         60]). This is the case when setHourHandMinuteCorrection(true)
	 *                         or setMinuteHandSecondCorrection(true) is selected.
	 *
	 * @return The converted value to angle.
	 */
	virtual float convertHandValueToAngle(uint8_t steps, uint8_t handValue, uint8_t secondHandValue = 0) const;

	/**
	 * Is animation enabled for the hands?
	 *
	 * @return true if animation is enabled.
	 */
	virtual bool animationEnabled() const;
};

}

#endif

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

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

TouchGFX Designer中模拟时钟的属性。

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

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

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

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

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

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

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

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

缓动 和 缓动选项 指定使用的缓动方程。
时间​

“时间”属性组允许用户设置时钟控件的初始时间,以及是否使用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)。

2.DigitalClock
#ifndef TOUCHGFX_DIGITALCLOCK_HPP
#define TOUCHGFX_DIGITALCLOCK_HPP
#include <touchgfx/TypedText.hpp>
#include <touchgfx/containers/clock/AbstractClock.hpp>
#include <touchgfx/hal/Types.hpp>
#include <touchgfx/widgets/TextAreaWithWildcard.hpp>

namespace touchgfx
{
class DigitalClock : public AbstractClock
{
public:
	/* 显示模式 */
	enum DisplayMode
	{
		DISPLAY_12_HOUR_NO_SECONDS, //12小时制,没有秒
		DISPLAY_24_HOUR_NO_SECONDS, //24小时制,没有秒
		DISPLAY_12_HOUR,            //12小时制
		DISPLAY_24_HOUR             //24小时制
	};

	DigitalClock();

	/* 设置宽度 */
	virtual void setWidth(int16_t width);

	/* 设置高度 */
	virtual void setHeight(int16_t height);

	/* 设置Y基线 */
	virtual void setBaselineY(int16_t baselineY);

	/* 设置文本 */
	virtual void setTypedText(TypedText typedText);

	/* 设置文本颜色 */
	virtual void setColor(colortype color);

	/* 获取文本颜色 */
	virtual colortype getColor() const;

	/* 设置显示模式 */
	virtual void setDisplayMode(DisplayMode dm)
	{
		displayMode = dm;
	}

	/* 获取显示模式 */
	virtual DisplayMode getDisplayMode() const
	{
		return displayMode;
	}

	/* 设置小时是否显示前导0 */
	void displayLeadingZeroForHourIndicator(bool displayLeadingZero);

	/* 设置透明度 */
	virtual void setAlpha(uint8_t newAlpha);

	/* 获取透明度 */
	virtual uint8_t getAlpha() const;

	/* 获取文本宽度 */
	virtual uint16_t getTextWidth() const
	{
		return text.getTextWidth();
	}

	/* 重绘 */
	virtual void invalidateContent() const
	{
		if (getAlpha() > 0)
		{
				AbstractClock::invalidateContent();
		}
	}

protected:
	static const int BUFFER_SIZE = 12; //通配符长度

	DisplayMode displayMode;             //显示模式
	bool useLeadingZeroForHourIndicator; //小时小于10时,是否加前导0

	TextAreaWithOneWildcard text;             //文本
	Unicode::UnicodeChar buffer[BUFFER_SIZE]; //通配符缓存

	virtual void updateClock();
};

}

#endif

TouchGFX中的数字时钟是一个控件,允许应用以数字文本的形式显示时间,而与此相对的模拟时钟使用模拟时钟指针显示时间。

数字时钟位于TouchGFX Designer中的Miscellaneous控件组中。

TouchGFX Designer中的数字时钟

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

W 和 H 指定控件的宽度和高度。

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

可见 指定控件的可见性。 如果将控件标记为不可见,还会禁止通过屏幕与控件进行交互。
时间使用Am/Pm 指定时间格式是12小时制还是24小时制。

显示小时的前导零指定是否应该启用小时的前导零。

显示秒数 指定是否显示秒数。

初始时间指定时钟显示的初始时间。
文本ID指定使用的文本。 如果控件使用自动生成的文本,ID将显示“自动生成”。.

翻译 指定要显示的文本内容。 文本必须有一个通配符才能正常工作。

字体排印 指定文本的格式。

对齐 指定文本的水平对齐方式。

如需详细了解关于文本配置的信息,请参阅 文本与字体一节。
外观文本色彩指定数字时钟中文本的颜色。

Alpha指定控件的透明度。
控件Alpha值的范围是0到255。 0表示完全透明,255表示不透明。
时间​

时间属性组用于通过更改不同的属性来调整时间在应用中的显示方式。 可以选择使用24小时制或12小时(AM/PM)制,方法是切换使用Am/Pm。 切换显示小时的前导零指定如何显示10时之前的时间(例如09:10:00或9:10:00),显示秒数开启、关闭“显示秒数”功能(例如,9:10:00或9:10)。

选择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)

下面的部分介绍了数字时钟支持的操作​

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IMU系列】什么是传感器的ODR和FSR实际如何配置传感器

使用更高的ODR信号有两个主要缺点&#xff1a;内存限制和功耗 以实际传感器为例

Redis分布式锁误删情况说明

4.4 Redis分布式锁误删情况说明 逻辑说明&#xff1a; 持有锁的线程在锁的内部出现了阻塞&#xff0c;导致他的锁自动释放&#xff0c;这时其他线程&#xff0c;线程2来尝试获得锁&#xff0c;就拿到了这把锁&#xff0c;然后线程2在持有锁执行过程中&#xff0c;线程1反应过…

成都正信晟锦:借了钱不还怎么起诉对方

在民间借贷中&#xff0c;遇到对方借钱不还的情况时&#xff0c;可以依法通过起诉的方式解决纠纷。首先&#xff0c;债权人应与债务人进行沟通&#xff0c;尝试和解。如果协商无果&#xff0c;则需收集证据&#xff0c;包括但不限于借条、转账记录、双方通讯记录等&#xff0c;…

mysql忘记密码如何重置

错误截图 解决方法 1. 关闭mysql服务器 net stop mysql服务名 2. 查找mysql安装路径中bin目录路径 3. cmd 打开该目录 4. 在my.ini所在的目录&#xff0c;新建一个init_pwd.txt文件。文件内容如下 ALTER user rootlocalhost identified by 密码; 5. 在第四步打开的cmd中 输…

vscode的基本使用(简洁版)

1.Vscode配置C/C开发环境 1.1 下载编译器 MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 下载并解压 -> 放到电脑C盘的根目录下 1.2 配置环境变量 1.3 安装C/C插件 2. 在VScode上编写C语言代码并编译成功 在vscode中写代码时,需要将代码放在…

在Idea里,执行npm命令 : 无法加载文件 ***\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

重建大师进行扫码认证了,接下来怎样才能正常使用?(如下图)

重建大师软件授权已经有了后&#xff0c;新建工程后设置任务目录和监控目录一致就可以运行了。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格…

Tiktok矩阵系统是什么?——Tiktok矩阵系统的优势、功能、及应用场景的介绍

摘要 Tiktok作为全球现象级的短视频平台,其发展前景日益明朗。 Tiktok全世界有多少用户? TikTok作为全球性的社交媒体平台,其用户数量一直在持续增长。根据最新的数据,预计到2024年,TikTok的用户数量将达到数十亿,覆盖全球范围内的各个年龄段和地区。具体来说,根据Ti…

互质数的个数(acwing)

题目描述&#xff1a; 给定 a,b&#xff0c;求 1≤x<a^b 中有多少个 x 与 a^b 互质。 由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模的结果。 输入格式&#xff1a; 输入一行包含两个整数分别表示 a,b&#xff0c;用一个空格分隔。 输出格式&#xf…

W25QXX系列W25Q64介绍

文章目录 前言介绍W25Q系列硬件电路四重SPI&#xff08;了解&#xff09; 框图Flash操作注意状态寄存器指令集电器特性 前言 W25Q64是一个8MByte大小的非易失性存储器&#xff0c;使用的是SPI协议&#xff0c;本文将全面介绍W25Q64的特性、工作原理以及注意事项 SPI详解见&am…

30万奖金谁能瓜分?OurBMC开源大赛决赛入围名单公示

首届开放原子开源大赛基础软件赛道自今年 1 月开启报名以来&#xff0c;吸引了全国各地 BMC 技术爱好者的广泛关注和踊跃报名。该赛事由开放原子开源基金会牵头&#xff0c; OurBMC 社区及理事长单位飞腾信息技术有限公司联合承办&#xff0c;以 “基于 BMC 技术的服务器故障诊…

CSS导读 (Emmet语法)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 续&#xff1a;七、Chrome调试工具 一、Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 &…

ctfshow web入门 php特性 web108--web115

web108 ereg函数相当于而preg_match()函数 ereg函数的漏洞&#xff1a;00截断。%00截断及遇到%00则默认为字符串的结束 strrev函数就是把字符串倒过来 就是说intval处理倒过来的传参c0x36d&#xff08;877&#xff09;?ca%00778 web109 异常处理类 通过异常处理类Excepti…

DFS-0与异或问题,有奖问答,飞机降落

代码和解析 #include<bits/stdc.h> using namespace std; int a[5][5]{{1,0,1,0,1}}; //记录图中圆圈内的值&#xff0c;并初始化第1行 int gate[11]; //记录10个逻辑门的一种排列 int ans; //答案 int logic(int x, int y, int op){…

3D引擎八叉树构建算法实现

最近&#xff0c;我一直在努力研究我的3D引擎Storm3D。 我花费大量时间的功能之一是开发一种通用且高效的八叉树数据结构&#xff0c;它将用于从碰撞检测到基于体素的渲染等多种用途。 在这里我将介绍构建八叉树的基本算法以及你可能遇到的一些障碍。 NSDT工具推荐&#xff1a;…

实习该选择c++后台开发(写业务逻辑)还是音视频开发(写sdk)?

后台开发:更多是理解需求、分析问题、解决bug等能力、对于逻辑培养有很大的帮助。可以进行软件开发、网络开发、游戏开发、以及之后可能的物联网相关开发。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「音视频开发的资料从专业入门到高级教程」&#…

光伏电站投资与收益能成正比吗?

光伏电站作为绿色能源的代表&#xff0c;近年来在全球范围内得到了广泛的关注和应用。然而&#xff0c;光伏电站的投资与收益是否能成正比&#xff0c;始终是投资者和市场关注的焦点。本文将就此问题进行深入探讨。 首先&#xff0c;我们必须明确光伏电站的投资与收益并非简单的…

黑马Seata入门到实战教程(学习笔记)

Seata CAP理论 BASE理论 XA AT TCC sage模式 缺点&#xff1a;数据隔离性安全问题 四种模式对比

破晓数据新纪元:隐语隐私计算,携手共创安全智能的未来生态

1.业务背景&#xff1a;安全核对产生的土壤 隐语隐私计算在安全核对业务背景下的应用&#xff0c;主要聚焦于解决企业在数据交换和分析过程中面临的隐私保护问题。 在许多行业中&#xff0c;特别是在金融、医疗、政务等领域&#xff0c;数据的安全核对至关重要&#xff0c;例如…

数据结构系列-队列的结构和队列的实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 队列 队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO&#xff0c;…