HarmonyOS Canvas 实现动画

HarmonyOS
6h前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-canvasrenderingcontext2d-V5

ArkTs的Canvas使用与webcanvas类似,相关动画实现可以移植webcanvas参考demo:

@Entry
@Component
struct Index {
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  @State timerId: number = 0
  @State startAngle: number = Math.PI * 0.2 + (Math.PI / 180) * 90; // 起始角度(弧度制)
  @State endAngle: number = Math.PI * 1.8 + (Math.PI / 180) * 90; // 结束角度(弧度制)
  lengthToAdd: number = Math.PI / 360; // 每次绘制的长度(弧度制)
  @State currentAngle: number = 0
  @State step: number = 1;
  // 设置圆心坐标和半径
  centerX = 200;
  centerY = 200;
  radius = 100;

  aboutToAppear(): void {
    this.currentAngle = this.startAngle
    this.timerId = setInterval(() => {
      if (this.step %2 == 1) {
        this.currentAngle += this.lengthToAdd;
        this.drawArc();
        if (this.currentAngle > this.endAngle) {
          this.step++;
          this.context.globalCompositeOperation = "destination-out"; // 修改混合模式,准备擦除
          this.context.lineWidth = 21; // 擦除时,线更宽一些,防止有残留
        }
      } else {
        this.eraseArc();
        this.currentAngle -= this.lengthToAdd;
        if (this.currentAngle<= this.startAngle) {
          this.step++;
          this.context.globalCompositeOperation = "source-over"; // 修改混合模式,正常绘制
          this.context.lineWidth = 20; // 正常线宽
        }
      }
    }, 10)
  }

  drawArc() {
    // 绘制圆弧
    this.context.beginPath();
    this.context.arc(
      this.centerX, // 圆弧中心的 x 坐标
      this.centerY + 30, // 圆弧中心的 y 坐标
      this.radius, // 圆弧的半径
      this.currentAngle - this.lengthToAdd, // 圆弧的起始角度(弧度制)
      this.currentAngle + this.lengthToAdd // 圆弧的结束角度(弧度制)
    );
    this.context.stroke();
  }

  eraseArc() {
    this.context.beginPath();
    this.context.arc(
      this.centerX,
      this.centerY + 30,
      this.radius,
      this.currentAngle - this.lengthToAdd,
      this.currentAngle + 2 * this.lengthToAdd // 擦除时,擦除的更宽一些,防止有残留
    );
    this.context.stroke();
  }

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#ffff00')
        .onReady(() => {
          // 设置圆弧的颜色和宽度
          this.context.strokeStyle = Color.Green;
          this.context.lineWidth = 20;
        })
    }
    .width('100%')
    .height('100%')
  }
}
分享
微博
QQ
微信
回复
4h前
相关问题
canvas如何实现水印效果
942浏览 • 1回复 待解决
HarmonyOS 如何实现WaveView动画
342浏览 • 1回复 待解决
HarmonyOS 如何实现RippleView动画
311浏览 • 1回复 待解决
HarmonyOS 如何实现旋转动画
446浏览 • 1回复 待解决
HarmonyOS 如何实现音频声浪动画
665浏览 • 1回复 待解决
HarmonyOS如何实现动态缩放动画
538浏览 • 1回复 待解决
HarmonyOS 点赞动画实现方案
14浏览 • 1回复 待解决
HarmonyOS 如何实现放大缩小的动画
377浏览 • 1回复 待解决
属性动画如何实现宽高动画效果
2032浏览 • 1回复 待解决
Canvas制作图表如何实现滑动惯性?
441浏览 • 1回复 待解决
HarmonyOS 怎样实现开屏动画或图片?
371浏览 • 1回复 待解决
如何应用属性动画实现宽高的动画
405浏览 • 1回复 待解决
如何实现动画转场效果
836浏览 • 1回复 待解决
HarmonyOS Canvas如何重置clip
251浏览 • 1回复 待解决
panGesture结合动画实现fling效果
890浏览 • 1回复 待解决