【HM】使用Canvas组件绘制实时闹钟 原创

与辉鸿蒙
发布于 2024-11-9 22:27
浏览
0收藏

效果如下:
【HM】使用Canvas组件绘制实时闹钟-鸿蒙开发者社区
准备图片素材
表盘图片:icon_clock_pan.png
时针图片:icon_hour_hand.png
分针图片:icon_minute_hand.png
秒针图片:icon_second_hand.png
【HM】使用Canvas组件绘制实时闹钟-鸿蒙开发者社区
使用Canvas组件
创建 CanvasRenderingContext2D 对象



设置画布关键属性和事件

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();
  }


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
    相关推荐