HarmonyOS canvas画图问题

代码如下:

struct MeterView {
  // 创建渲染上下文设置和画布渲染上下文
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  // 定义标记中心、标记范围、显示后缀和当前数值
  private markCenter: number = 0;
  private markRange: number = 10;
  private displaySuffix: string = "";
  private _currentNum: number = this.markCenter;
  // 定义画布宽度、高度和其它绘制参数
  private canvasWidth: number = 0;
  private canvasHeight: number = 0;
  private padTop: number = 36;
  private arcSize: number = 50; // 调整后的弧度大小,上下保持一致
  private markTextSize: number = 30;
  private displayTextSize: number = 48;
  private currentPercent: number = 0;
  private percentTo: number = 0;

  // 组件构建函数
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      // 创建画布
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor(Color.White)
        .onReady(() => {
          this.canvasWidth = this.context.width;
          this.canvasHeight = this.context.height;
          this.onDraw();
        })
        .borderColor('#5c000000')
        .borderStyle(BorderStyle.Solid)
    }
    .width('100%')
    .height('100%')
  }

  // 绘制函数
  onDraw() {
    const context = this.context;

    context.clearRect(0, 0, this.canvasWidth, this.canvasHeight);

    const moveDown = this.canvasHeight / 4;

    // 界面上部绘制
    context.fillStyle = '#D3D3D3'; // 浅灰色
    context.beginPath();
    context.moveTo(0, 0);
    context.lineTo(0, this.padTop + moveDown);
    context.quadraticCurveTo(this.canvasWidth / 2, this.padTop - this.arcSize + moveDown, this.canvasWidth,
      this.padTop + moveDown);
    context.lineTo(this.canvasWidth, 0);
    context.closePath();
    context.fill(); // 绿色长刻度线绘制
    context.save();
    context.translate(this.canvasWidth / 2, this.padTop + moveDown);

    context.strokeStyle = '#00FF00'; // 绿色
    context.lineWidth = 3;
    for (let i = -3; i <= 3; i++) {
      const angle = i * (Math.PI / 6); // 每个刻度的角度
      const x1 = this.arcSize * Math.cos(angle); // 起点的x坐标
      const y1 = this.arcSize * Math.sin(angle); // 起点的y坐标
      const x2 = (this.arcSize + 10) * Math.cos(angle); // 终点的x坐标
      const y2 = (this.arcSize + 10) * Math.sin(angle); // 终点的y坐标

      context.beginPath();
      context.moveTo(x1, y1);
      context.lineTo(x2, y2);
      context.stroke();
    }
    context.restore();
    context.save();
    context.translate(this.canvasWidth / 2, this.padTop + moveDown);

    // 绘制灰色的次刻度线
    context.strokeStyle = '#808080'; // 灰色
    context.lineWidth = 2;
    for (let i = -15; i <= 15; i++) {
      if (i % 5 !== 0) {
        const angle = i * (Math.PI / 30); // 每个刻度的角度
        const x1 = (this.arcSize / 2) * Math.cos(angle); // 起点的x坐标
        const y1 = (this.arcSize / 2) * Math.sin(angle); // 起点的y坐标
        const x2 = (this.arcSize / 2 + 10) * Math.cos(angle); // 终点的x坐标
        const y2 = (this.arcSize / 2 + 10) * Math.sin(angle); // 终点的y坐标

        context.beginPath();
        context.moveTo(x1, y1);
        context.lineTo(x2, y2);
        context.stroke();
      }
    }
    context.restore();
  }
}

绿色长刻度线和短刻度线,怎么绘画在界面上部那个弧线上均匀分布?

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

quadraticCurveTo只是绘制,具体的绘制位置需要自行计算,计算思路弧线所在的圆的方程,然后均分这个弧就行,在均分的位置上画刻度,弧线所在的圆是固定的,也就是圆A的半径是固定的为R。假设弧对应的圆心角是∠o=60°那么对应的弧长就是固定的,弧长l=Π_R_o/180,等分为n等分每份的长度为:Ln = l/n,以屏幕正中间的弧上点为基准(0,R)去计算其它等分点的位置就可以。确定了起始点,再调用Api划线就行。

分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS Canvas绘制image的API相关问题
34浏览 • 1回复 待解决
HarmonyOS Canvas中关于绘制图片问题
403浏览 • 1回复 待解决
鸿蒙有很好的画图功能可以使用吗
2542浏览 • 1回复 已解决
HarmonyOS Canvas怎么刷新
86浏览 • 1回复 待解决
HarmonyOS Canvas 实现动画
64浏览 • 1回复 待解决
HarmonyOS Canvas绘制圆角
12浏览 • 1回复 待解决
HarmonyOS Canvas如何重置clip
290浏览 • 1回复 待解决
HarmonyOS Canvas如何设置圆角
55浏览 • 1回复 待解决
HarmonyOS Canvas绘制圆角矩形
26浏览 • 1回复 待解决
HarmonyOS Canvas绘制曲线相关
16浏览 • 1回复 待解决
HarmonyOS 如何使用Canvas画扇形
22浏览 • 1回复 待解决
HarmonyOS Canvas如何触发重绘
185浏览 • 1回复 待解决
HarmonyOS svg、canvas 的使用详情
498浏览 • 1回复 待解决
HarmonyOS Canvas绘制内容如何更新
39浏览 • 1回复 待解决
HarmonyOS 如何使用canvas绘制虚线
41浏览 • 1回复 待解决
HarmonyOS 环形渐变canvas实现方式
28浏览 • 1回复 待解决
如何操作canvas重新绘制
1116浏览 • 1回复 待解决
canvas 貌似不识别啊?
6700浏览 • 1回复 待解决
The <canvas> component does not exist.
8519浏览 • 3回复 待解决
怎么让Canvas刷新呀?
478浏览 • 1回复 待解决
canvas如何实现水印效果
975浏览 • 1回复 待解决