HarmonyOS NEXT 使用Canvas实现模拟时钟案例

server/2024/10/18 18:20:44/

介绍

本示例介绍利用 Canvas  和定时器实现模拟时钟场景,该案例多用于用户需要显示自定义模拟时钟的场景。

效果图预览

使用说明

无需任何操作,进入本案例页面后,所见即模拟时钟的展示。

使用说明

无需任何操作,进入本案例页面后,所见即模拟时钟的展示。

实现思路

本例的的主要实现思路如下:

  • 利用CanvasRenderingContext2D中的drawImage将表盘和表针绘制出来;
  • 利用定时器每秒刷新一次,计算好时针、分针、秒针对应的偏移量,重新绘制表盘和表针,实现表针的转动。

本例中代码详情可参考AnalogClock.ets和TimeChangeListener.ets

1.在aboutToAppear中执行init函数,初始化表盘和表针对应的pixelMap,并首次绘制表盘和表针,保证进入页面即展示时钟。

// 初始化表盘和表针对应的变量,并首次绘制。
private init() {let clockBgSource = image.createImageSource(this.resourceDir + '/' + CLOCK_BG_PATH);let hourSource = image.createImageSource(this.resourceDir + '/' + CLOCK_HOUR_PATH);let minuteSource = image.createImageSource(this.resourceDir + '/' + CLOCK_MINUTE_PATH);let secondSource = image.createImageSource(this.resourceDir + '/' + CLOCK_SECOND_PATH);const now = new Date();const currentHour = now.getHours();const currentMinute = now.getMinutes();const currentSecond = now.getSeconds();this.time = this.getTime(currentHour, currentMinute, currentSecond);// 创建表盘对应的PixelMap并绘制。let paintDial = clockBgSource.createPixelMap().then((pixelMap: image.PixelMap) => {this.clockPixelMap = pixelMap;this.paintDial();}).catch((err: BusinessError) => {logger.error(`[error]error at clockBgSource.createPixelMap:${err.message}`);});// 创建时针对应的PixelMap并绘制。hourSource.createPixelMap().then(async (pixelMap: image.PixelMap) => {await paintDial;const hourOffset = currentMinute / 2;this.paintPin(ANGLE_PRE_HOUR * currentHour + hourOffset, pixelMap);this.hourPixelMap = pixelMap;}).catch((err: BusinessError) => {logger.error(`[error]error at hourSource.createPixelMap:${err.message}`);});...
}

2.为表盘和表针的绘制注册监听,每秒钟重新绘制一次,实现时钟的转动。

// 2.监听时间变化,每秒重新绘制一次
this.timeListener = new TimeChangeListener((hour: number, minute: number, second: number) => {this.renderContext.clearRect(-this.clockRadius, -this.clockRadius, this.canvasSize, this.canvasSize);this.paintDial();this.timeChanged(hour, minute, second);this.time = this.getTime(hour, minute, second);},
);

3.表针的绘制逻辑也是关键的一部分,因表针的绘制涉及旋转场景,需每次在旋转前先保存当前的绘制状态,旋转绘制结束后再恢复,防止多次旋转导致时间错乱。

// 绘制表针
private paintPin(degree: number, pinImgRes: image.PixelMap | null) {// TODO:知识点:先将当前绘制上下文保存再旋转画布,先保存旋转前的状态,避免状态混乱。this.renderContext.save();const angleToRadian = Math.PI / 180;let theta = degree * angleToRadian;this.renderContext.rotate(theta);this.renderContext.beginPath();if (pinImgRes) {this.renderContext.drawImage(pinImgRes,-IMAGE_WIDTH / 2,-this.clockRadius,IMAGE_WIDTH,this.canvasSize);} else {logger.error('PixelMap is null!');}this.renderContext.restore();
}

高性能知识点

不涉及

工程结构&模块类型

analogclock                             // har类型
|---src/main/ets/pages
|   |---AnalogClock.ets                 // 页面及时钟绘制的主要逻辑
|   |---TimeChangeListener.ets          // 时间变化监听文件

模块依赖

路由管理模块

utils

参考资料

canvas

CanvasRenderingContext2D

image

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.
鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.ppmy.cn/server/7920.html

相关文章

微服务之SpringCloud AlibabaNacos服务注册和配置中心

一、概述 1.1注册中心原理 在微服务远程调用的过程中,包括两个角色: 服务提供者:提供接口供其它微服务访问,比如item-service 服务消费者:调用其它微服务提供的接口,比如cart-service 在大型微服务项目…

【C++】类型转换

文章目录 一、种类1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast 二、RTTI 一、种类 1. static_cast static_cast用于相近类型的转换, 比如double, int, char… 不能用于不相关的类型转换. 类似于C语言中的隐式类型转换, 但是static_cast增强了可视性: i…

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选…

http和https区别与上网过程

1.概念 HTTP和HTTPS是两种常用于Web浏览器和网站服务器之间信息传递的协议。HTTP在传输数据时使用的是明文,而HTTPS则是在HTTP的基础上增加了SSL/TLS加密层,提供了数据的加密传输。 HTTP(超文本传输协议):是一个基于…

idea设置了maven会自动变回C盘那个

idea设置了maven会自动变回C盘那个 IDE支持Maven包装器,IDEA会将其用于项目,如果不想从包装器中使用Maven。 需要将项目中.mvn/wrapper/下的maven-wrapper.properties从项目中删除。

nacos 2022.0.0.0 版本实现负载均衡及集群

一、loadbalancer实现负载均衡 新版本的nacos已经取消了对ribbon的支持&#xff0c;所以不能使用ribbon来实现nacos提供的负载均衡。 但是新版本中我们可以使用loadbalancer实现负载均衡。 二、导入loadbalancer坐标 1、原本的坐标&#xff1a; 在parent的pom.xml中 <p…

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

SQL语句每日一练十

586. 订单最多的客户 题目 表: Orders --------------------------- | Column Name | Type | --------------------------- | order_number | int | | customer_number | int | --------------------------- 在 SQL 中&#xff0c;Order_number是该表的…