HarmonyOS 绘制圆滑折线或绘制曲线

当前需求如下,具体样式如图

在固定宽度216,高度128的区域内绘制如下表格折线

1.在y轴方向,将此区域分成两部分,上部区域高度110,下部区域高度18,两部分区域交接位置,使用横线实线分割,实线size为1,颜色为#F1F1F1

2.在x轴方向,按照宽度54,将此固定区域均分4分,每一份之间通过纵向虚线间隔

3.被均分的4分区域底部,每份底部绘制居中的日期text(mock一下),文本fontSize为10,颜色#9F9F9F,

3.被均分的4分区域,每一份中都有一个坐标点,此坐标点x轴需要居于当前区域的中点位置,坐标点为填充圆形,直径为8,颜色为#7D8FFF。(具体Y坐标位置可以mock一下)

4.将坐标点依次连接,连接线为圆滑曲线,size为3,颜色为#DBE0FF

有示例代码么

HarmonyOS 绘制圆滑折线或绘制曲线  -鸿蒙开发者社区

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

drawing模块绘制贝塞尔曲线的例子可以参考以下案例:

import { RenderNode, DrawContext, FrameNode, NodeController } from "@ohos.arkui.node"
import drawing from "@ohos.graphics.drawing"

class TextRenderNode extends RenderNode {

  async draw(context: DrawContext) {
    const canvas = context.canvas;
    const pen = new drawing.Pen();
    pen.setStrokeWidth(5);
    pen.setColor({alpha: 255, red: 255, green: 0, blue: 0});
    let path = new drawing.Path();
    path.moveTo(200,200);
    path.cubicTo(250, 200, 250, 100, 300, 100);
    // path.moveTo(400,400);
    path.cubicTo(350,100,350,200,400,200)
    // path.close();
    canvas.attachPen(pen);
    canvas.drawPath(path);
    canvas.detachPen();
  }
}

class MyNodeController extends NodeController {
  private rootNode: FrameNode | null = null;
  private nodeArray: Array<TextRenderNode> = []
  addMyNode(item:TextRenderNode){
    this.nodeArray.push(item)
  }

  makeNode(uiContext: UIContext): FrameNode | null {
    this.rootNode = new FrameNode(uiContext);
    const renderNode = this.rootNode.getRenderNode();
    if (renderNode === null) {
      return this.rootNode;
    }
    if (renderNode) {
      renderNode.clearChildren()
      this.nodeArray.forEach((item) => {
        renderNode.appendChild(item)
      })
    }
    return this.rootNode;
  }
}

@Entry
@Component
struct Index {
  @State newNode:TextRenderNode = new TextRenderNode();
  @State nodeCV:MyNodeController = new MyNodeController()
  tempY = 0
  build() {
    Column() {
      Column() {
        NodeContainer(this.nodeCV)
          .width('100%')
          .height(200)
        Button('Invalidate')
          .onClick(() => {
            let newNode = new TextRenderNode()
            newNode.frame = { x: 0, y: this.tempY, width: 200, height: 100 }
            this.nodeCV.addMyNode(newNode)
            this.nodeCV.rebuild()
            this.tempY += 100
          })
      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
  }
}

相关接口:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-graphics-drawing-V5#cubicto

画虚线参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-canvasrenderingcontext2d-V5#setlinedash

分享
微博
QQ
微信
回复
2天前
相关问题
自定义组件之绘制折线图和曲线
1418浏览 • 1回复 待解决
HarmonyOS Canvas绘制曲线相关
167浏览 • 1回复 待解决
HarmonyOS 地图绘制曲线的点击
11浏览 • 1回复 待解决
HarmonyOS 贝塞尔曲线绘制
211浏览 • 1回复 待解决
DevEco Stduio如何绘制折线
4561浏览 • 1回复 待解决
HarmonyOS XComponent绘制
90浏览 • 1回复 待解决
HarmonyOS 怎么绘制emoji
103浏览 • 1回复 待解决
HarmonyOS Canvas绘制圆角
179浏览 • 1回复 待解决
HarmonyOS 如何绘制原生组件
88浏览 • 1回复 待解决
HarmonyOS 日历相关的绘制
120浏览 • 1回复 待解决
SurfaceProvider绘制延迟
7589浏览 • 4回复 已解决
HarmonyOS 底部导航绘制问题
396浏览 • 1回复 待解决
HarmonyOS 是否支持绘制半圆
148浏览 • 1回复 待解决
HarmonyOS Canvas绘制圆角矩形
195浏览 • 1回复 待解决
HarmonyOS 绘制水印如何实现?
296浏览 • 1回复 待解决
HarmonyOS OpenGL 绘制的相关资料
212浏览 • 1回复 待解决
HarmonyOS 自定义字体绘制
203浏览 • 1回复 待解决
HarmonyOS 图表绘制折叠屏适配
14浏览 • 1回复 待解决
如何操作canvas重新绘制
1272浏览 • 1回复 待解决