• 作者:老汪软件技巧
  • 发表时间:2024-10-11 15:02
  • 浏览量:

前面我们讲过几期鸿蒙自定义View 的教程,赶着现在国庆,周边到处都是挂满的过期,咋们也来出一期鸿蒙自定义View实现五星红旗的教程

首先,我们特别需要注意的是 五星红旗 在国旗法中有明确的制法说明。

其要点大概是:宽与高之比为3比2,五颗星都在左上四分之一小矩形内,最大星直径约为高的十分之一,四个小五解星的一个角要指向大五角星的中心。

1. 实现步骤

我们将使用 CanvasRenderingContext2D 来绘制五星红旗。主要包含以下步骤:

绘制红色矩形背景。使用五角星绘制函数分别绘制一个大五角星和四个小五角星。1.1 五角星绘制函数

我们定义了一个通用的 drawStar 函数,用来在给定的中心点位置绘制五角星:

private drawStar(
  context: CanvasRenderingContext2D,
  centerX: number,
  centerY: number,
  radius: number,
  color: string
) {
  const path = new Path2D()
  const pointNumber = 5
  const angle = Math.PI / pointNumber
  const innerRadius = radius * Math.cos(angle) / 2
​
  for (let i = 0; i <= pointNumber * 2; i++) {
    const r = (i % 2 === 1) ? radius : innerRadius
    const omega = angle * i
​
    const x = centerX + r * Math.sin(omega)
    const y = centerY + r * Math.cos(omega)
​
    if (i === 0) {
      path.moveTo(x, y)
    } else {
      path.lineTo(x, y)
    }
  }
​
  path.closePath()
  context.fillStyle = color
  context.fill(path)
}

1.2 组件构建

在 @Entry 标记的 FiveStarsRedFlag 组件中,我们使用了 Canvas 来创建画布并在其上绘制五星红旗:

@Component
struct FiveStarsRedFlag {
  @State private animationValue: number = 0
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
​
  build() {
    Column() {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .onReady(() => {
          this.drawFlag()
        })
    }
  }
​
  private drawFlag() {
    if (!this.context) return
​
    // 绘制红色背景
    this.context.fillStyle = '#FF0000' // 红色
    this.context.fillRect(0, 0, 300, 200)
​
    // 绘制大五角星
    this.drawStar(this.context, 50, 50, 30, '#FFFF00') // 黄色五角星
​
    // 绘制四个小五角星
    this.drawStar(this.context, 100, 20, 10, '#FFFF00')
    this.drawStar(this.context, 120, 40, 10, '#FFFF00')
    this.drawStar(this.context, 120, 70, 10, '#FFFF00')
    this.drawStar(this.context, 100, 90, 10, '#FFFF00')
  }
}

1.3 使用方法及效果展示

build() {
  RelativeContainer() {
    Text(this.message)
      .id('HelloWorld')
      .fontSize(50)
      .fontWeight(FontWeight.Bold)
      .alignRules({
        center: { anchor: '__container__', align: VerticalAlign.Center },
        middle: { anchor: '__container__', align: HorizontalAlign.Center }
      })
    FiveStarsRedFlag()
  }
  .height('100%')
  .width('100%')
}

通过 Canvas 和 CanvasRenderingContext2D,我们可以轻松实现类似于 HTML5 Canvas 的绘图效果。 是不是有手就行. 后续让五星红旗迎风飘扬的效果我将单独在出一期 ,鸿蒙动画效果的实现小伙伴们可以持续关注.