HarmonyOS 鸿蒙Next 【HM】使用Canvas组件绘制实时闹钟
HarmonyOS 鸿蒙Next 【HM】使用Canvas组件绘制实时闹钟 效果如下:
准备图片素材
- 表盘图片:icon_clock_pan.png
- 时针图片:icon_hour_hand.png
- 分针图片:icon_minute_hand.png
- 秒针图片:icon_second_hand.png
使用Canvas组件
- 创建
CanvasRenderingContext2D
对象
private renderContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(new RenderingContextSettings(true));
- 设置画布关键属性和事件
// 画布尺寸
private canvasSize: number = 252;
// 绘制间隔时间
private drawInterval: number = -1;
private clockRadius: number = this.canvasSize / 2 - 2;
Canvas(this.renderContext)
.width(this.canvasSize)
.aspectRatio(1)
.onReady(() => {
if (this.drawInterval === -1) {
// 开始绘制
this.startDrawTask();
}
})
- 启动定时任务,每秒绘制一次(与实时时间同步)
/**
* 启动定时绘制任务
*/
private startDrawTask(): void {
console.log("开始绘制");
this.renderContext.translate(this.canvasSize / 2, this.canvasSize / 2);
this.drawClockArea()
this.drawInterval = setInterval(() => {
this.drawClockArea()
}, 1000);
}
- 绘制闹钟区域
/**
* 绘制闹钟区域
*/
private drawClockArea(): void {
console.log("绘制时区");
let date = new Date();
let hour = date.getHours();
let minute = date.getMinutes();
let second = date.getSeconds();
this.renderContext.clearRect(
-this.canvasSize,
-this.canvasSize / 2,
this.canvasSize * 2,
this.canvasSize
);
if (true) {
this.drawClockPan();
this.drawClockHands(
30 * (hour > 12 ? hour - 12 : hour)
+ minute / 12 * 6,
"images/icon_hour_hand.png");
this.drawClockHands(minute * 6, "images/icon_minute_hand.png");
this.drawClockHands(second * 6, "images/icon_second_hand.png");
}
- 绘制表盘
/**
* 绘制表盘
*/
private drawClockPan(): void {
console.log("绘制表盘");
let imgWidth = this.clockRadius * 2;
let secondImg = new ImageBitmap("images/icon_clock_pan.png");
this.renderContext.beginPath();
this.renderContext.drawImage(
secondImg,
-this.clockRadius,
-this.clockRadius,
imgWidth, imgWidth);
this.renderContext.restore();
console.log(`clockRadius:${-this.clockRadius};imgWidth:${imgWidth}`)
}
- 绘制时、分、秒针
/**
* 绘制表针:时针、分针、秒针
*/
private drawClockHands(degree: number, handImgRes: string): void {
console.log("绘制表针");
let imgWidth = 10;
let handImg = new ImageBitmap(handImgRes);
let theta = (degree + 180) * Math.PI / 180;
this.renderContext.save();
this.renderContext.rotate(theta);
this.renderContext.beginPath();
this.renderContext.drawImage(
handImg,
-imgWidth / 2,
-this.clockRadius,
imgWidth,
this.clockRadius * 2);
this.renderContext.restore();
}
更多关于HarmonyOS 鸿蒙Next 【HM】使用Canvas组件绘制实时闹钟的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
有时间试下
更多关于HarmonyOS 鸿蒙Next 【HM】使用Canvas组件绘制实时闹钟的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS中,使用Canvas组件绘制实时闹钟可以通过以下步骤实现:
-
创建Canvas组件:首先,在布局文件中添加Canvas组件,用于绘制闹钟的图形界面。
-
获取Canvas上下文:在代码中获取Canvas的上下文对象,通过该对象可以进行绘制操作。
-
绘制表盘:使用Canvas的绘制方法,如
drawCircle
、drawLine
等,绘制闹钟的表盘、刻度、指针等元素。 -
实时更新:通过定时器(如
setInterval
)定期更新Canvas上的内容,确保闹钟的指针能够实时移动。 -
处理用户交互:如果需要,可以通过事件监听器处理用户的交互操作,如设置闹钟时间等。
以下是一个简单的代码示例:
// 获取Canvas上下文
const ctx = canvas.getContext('2d');
// 绘制表盘
function drawClock() {
// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制表盘
ctx.beginPath();
ctx.arc(150, 150, 100, 0, 2 * Math.PI);
ctx.stroke();
// 绘制刻度
for (let i = 0; i < 12; i++) {
const angle = (i * 30) * Math.PI / 180;
const x1 = 150 + Math.cos(angle) * 90;
const y1 = 150 + Math.sin(angle) * 90;
const x2 = 150 + Math.cos(angle) * 100;
const y2 = 150 + Math.sin(angle) * 100;
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
}
// 获取当前时间
const now = new Date();
const hours = now.getHours();
const minutes = now.getMinutes();
const seconds = now.getSeconds();
// 绘制时针
const hourAngle = (hours % 12 + minutes / 60) * 30 * Math.PI / 180;
drawHand(hourAngle, 50, 6);
// 绘制分针
const minuteAngle = (minutes + seconds / 60) * 6 * Math.PI / 180;
drawHand(minuteAngle, 70, 4);
// 绘制秒针
const secondAngle = seconds * 6 * Math.PI / 180;
drawHand(secondAngle, 80, 2);
}
// 绘制指针
function drawHand(angle, length, width) {
const x = 150 + Math.cos(angle - Math.PI / 2) * length;
const y = 150 + Math.sin(angle - Math.PI / 2) * length;
ctx.beginPath();
ctx.moveTo(150, 150);
ctx.lineTo(x, y);
ctx.lineWidth = width;
ctx.stroke();
}
// 定时更新
setInterval(drawClock, 1000);
通过以上步骤,可以在HarmonyOS中使用Canvas组件实现一个简单的实时闹钟。
在HarmonyOS鸿蒙Next中,使用Canvas组件绘制实时闹钟可以通过以下步骤实现:
-
创建Canvas组件:在布局文件中添加Canvas组件,并设置其大小和位置。
-
绘制表盘:使用Canvas的
drawCircle
方法绘制表盘,drawLine
方法绘制刻度。 -
绘制指针:使用
drawLine
方法分别绘制时针、分针和秒针,并通过rotate
方法实现指针的旋转。 -
实时更新:使用
Timer
或Handler
定时器,每隔一秒更新一次Canvas,重新绘制指针位置以反映当前时间。 -
获取时间:通过
Calendar
类获取当前的小时、分钟和秒,计算指针的角度并更新绘制。
通过这些步骤,你可以在HarmonyOS中实现一个实时更新的闹钟界面。