HarmonyOS 鸿蒙Next 【HM】使用Canvas组件绘制实时闹钟

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 【HM】使用Canvas组件绘制实时闹钟 效果如下:

准备图片素材

  • 表盘图片:icon_clock_pan.png
  • 时针图片:icon_hour_hand.png
  • 分针图片:icon_minute_hand.png
  • 秒针图片:icon_second_hand.png

使用Canvas组件

  1. 创建 CanvasRenderingContext2D 对象
private renderContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(new RenderingContextSettings(true));
  1. 设置画布关键属性和事件
// 画布尺寸
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();
          }
        })
  1. 启动定时任务,每秒绘制一次(与实时时间同步)
/**
* 启动定时绘制任务
*/
private startDrawTask(): void {
  console.log("开始绘制");
  this.renderContext.translate(this.canvasSize / 2, this.canvasSize / 2);
  this.drawClockArea()
  this.drawInterval = setInterval(() => {
    this.drawClockArea()
  }, 1000);
}
  1. 绘制闹钟区域
/**
 * 绘制闹钟区域
 */
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");
  }
  1. 绘制表盘
/**
 * 绘制表盘
 */
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}`)
}
  1. 绘制时、分、秒针
/**
 * 绘制表针:时针、分针、秒针
 */
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

3 回复

有时间试下

更多关于HarmonyOS 鸿蒙Next 【HM】使用Canvas组件绘制实时闹钟的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,使用Canvas组件绘制实时闹钟可以通过以下步骤实现:

  1. 创建Canvas组件:首先,在布局文件中添加Canvas组件,用于绘制闹钟的图形界面。

  2. 获取Canvas上下文:在代码中获取Canvas的上下文对象,通过该对象可以进行绘制操作。

  3. 绘制表盘:使用Canvas的绘制方法,如drawCircledrawLine等,绘制闹钟的表盘、刻度、指针等元素。

  4. 实时更新:通过定时器(如setInterval)定期更新Canvas上的内容,确保闹钟的指针能够实时移动。

  5. 处理用户交互:如果需要,可以通过事件监听器处理用户的交互操作,如设置闹钟时间等。

以下是一个简单的代码示例:

// 获取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组件绘制实时闹钟可以通过以下步骤实现:

  1. 创建Canvas组件:在布局文件中添加Canvas组件,并设置其大小和位置。

  2. 绘制表盘:使用Canvas的drawCircle方法绘制表盘,drawLine方法绘制刻度。

  3. 绘制指针:使用drawLine方法分别绘制时针、分针和秒针,并通过rotate方法实现指针的旋转。

  4. 实时更新:使用TimerHandler定时器,每隔一秒更新一次Canvas,重新绘制指针位置以反映当前时间。

  5. 获取时间:通过Calendar类获取当前的小时、分钟和秒,计算指针的角度并更新绘制。

通过这些步骤,你可以在HarmonyOS中实现一个实时更新的闹钟界面。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!