HarmonyOS鸿蒙Next中饼形图刷新

HarmonyOS鸿蒙Next中饼形图刷新

咨询描述: 如何实时刷新饼形图数据

以下为饼形图代码CustomPieChart:

@Component
export struct CustomPieChart {
  // 饼图数据
  @State picChartElements: PicChartElement[] = []
  // 圆半径
  @State circle_radius: number = 50
  // 单位
  @State unit: string = ""

  // 获取上下文
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  aboutToAppear() {
    let total = 0
    // 统计总数量
    this.picChartElements.forEach(value => {
      total += value.quantity
    })

    // 初始化 弧线的终止弧度
    let lastEndAngle = -0.5 * Math.PI
    // 封装饼图数据
    this.picChartElements.forEach(value => {
      // 占用百分比
      let percent = value.quantity / total
      // 四舍五入,获取整数
      value.percent = Math.round(percent * 100)
      // 初始化终止弧度为 弧线的起始弧度
      value.beginAngle = lastEndAngle
      // 计算弧线的终止弧度
      value.endAngle = (percent * 2 * Math.PI) + lastEndAngle
      // 赋值终止弧度为变量,作为下次的起始弧度
      lastEndAngle = value.endAngle
      // 返回封装好的对象
      return value
    })
  }

  build() {
    Column() {
      Canvas(this.context)
        // 高度为半径2倍
        .height(this.circle_radius * 2)
        // 纵横比,宽度和高度一样
        .aspectRatio(1)
        // 画布组件的事件回调,可以在此时进行绘制
        .onReady(() => {
          this.picChartElements.forEach(item => {
            // 创建一个新的控制路径
            this.context.beginPath()
            // 路径从当前点移动到指定点
            this.context.moveTo(this.circle_radius, this.circle_radius)
            // 绘制弧线路径(弧线圆心的x坐标值,弧线圆心的y坐标值,弧线的圆半径,弧线的起始弧度,弧线的终止弧度)
            this.context.arc(this.circle_radius, this.circle_radius, this.circle_radius, item.beginAngle, item.endAngle)
            // 指定绘制的填充色
            this.context.fillStyle = item.color
            // 对封闭路径进行填充
            this.context.fill()
          })
        })
    }
    .height('100%')
  }
}

export class PicChartElement {
  quantity: number // 数量
  percent: number = 0 // 百分比
  beginAngle: number = 0 // 弧线的起始弧度
  endAngle: number = 0 // 弧线的终止弧度
  color: string // 颜色

  constructor(quantity: number, color: string) {
    this.quantity = quantity
    this.color = color
  }
}

在另一个页面调用饼形图DVRVideoSettingPage:
@Component
struct DVRVideoSettingPage {
  @State mCameraMenuCardInfoLifeTimeTotal: number = 10
  @State mCameraMenuCardInfoLifeTime: number = 1

  // 饼图数据
  @State picChartElements2: PicChartElement[] = [
    new PicChartElement(this.mCameraMenuCardInfoLifeTimeTotal, '#32B16C'),
    new PicChartElement(this.mCameraMenuCardInfoLifeTime, '#474EE7')
  ]

  build {
    CustomPieChart({picChartElements: this.picChartElements2, circle_radius: 54, unit: ''})
  }

//获取存储卡信息
async deviceCameraSettingValue() {
  let commandURL: string =
    ConnectDVRWiFiUtils.getDeviceCgiPathURI(DVRCommandURI.CameraMenuCardInfo)

  await MyAxiosUtil.makeRequest(getContext(this), commandURL, AxiosRequestMethod.GET, {}, AxiosBaseURLType.SPECIAL,
    (result) => {
      if (result != null) {
        if (result.includes("0\\nOK\\n")) {
          const lines = result.split('\\n');
          for (let i = 0; i < lines.length; i++) {
            if(lines[i].startsWith(DVRCommandURI.CameraMenuCardInfoLifeTimeTotal)) {
              // 保留一位小数
              this.mCameraMenuCardInfoLifeTimeTotalGB = Number.parseFloat(lines[i].split(DVRCommandURI.CameraMenuCardInfoLifeTimeTotal)[1]).toFixed(1) + 'GB'
              this.mCameraMenuCardInfoLifeTimeTotal = Number.parseFloat(lines[i].split(DVRCommandURI.CameraMenuCardInfoLifeTimeTotal)[1])
            } else if(lines[i].startsWith(DVRCommandURI.CameraMenuCardInfoRemainLifeTime)) {
              // 保留一位小数
              this.mCameraMenuCardInfoLifeTimeGB = Number.parseFloat(lines[i].split(DVRCommandURI.CameraMenuCardInfoRemainLifeTime)[1]).toFixed(1) + 'GB'
              this.mCameraMenuCardInfoLifeTime = Number.parseFloat(lines[i].split(DVRCommandURI.CameraMenuCardInfoRemainLifeTime)[1])
            }
          }
        } else {
          ToastUtils.showToast($r('app.string.toast_command_failed'))
        }
      }
    }, (error) => {
      ToastUtils.showToast($r('app.string.toast_command_failed'))
    })
}

mCameraMenuCardInfoLifeTimeTotal与mCameraMenuCardInfoLifeTime是可变化的,饼形图如何根据这两个值的变化而变化


更多关于HarmonyOS鸿蒙Next中饼形图刷新的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可以尝试使用@Link@Watch 来对 mCameraMenuCardInfoLifeTimeTotal 与 mCameraMenuCardInfoLifeTime 这两个属性进行侦听,当 @Watch 发现参数发生变化时,刷新饼图信息。文档请参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-watch-V5

更多关于HarmonyOS鸿蒙Next中饼形图刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,饼形图的刷新通常通过数据驱动的方式实现。开发者可以通过更新数据源来触发饼形图的重新渲染。具体步骤如下:

  1. 数据源更新:首先,开发者需要更新饼形图的数据源。数据源通常是一个包含各个扇区数值的数组或对象列表。更新数据源后,系统会自动检测到数据变化。

  2. UI刷新:一旦数据源发生变化,HarmonyOS的UI框架会自动触发饼形图的刷新。开发者无需手动调用刷新方法,系统会根据新的数据重新绘制饼形图。

  3. 动画效果:在刷新过程中,鸿蒙系统支持平滑的过渡动画效果。开发者可以通过设置动画参数来控制刷新时的视觉效果,如动画持续时间、缓动函数等。

  4. 性能优化:为了确保饼形图刷新时的性能,建议尽量减少频繁的数据源更新操作。可以通过批量更新数据或使用异步操作来优化刷新性能。

总结来说,HarmonyOS鸿蒙Next中饼形图的刷新是通过数据驱动的,开发者只需更新数据源,系统会自动处理UI刷新和动画效果。

在HarmonyOS鸿蒙Next中,刷新饼形图可以通过更新数据源并重新渲染图表来实现。首先,确保你的数据源是可变的,比如使用@State装饰器标记。然后,在需要刷新时,更新数据源的内容。最后,调用图表的update()方法或重新设置数据源,触发UI重新渲染。示例代码如下:

@State private data: Array<number> = [30, 40, 30];

updateChart() {
  this.data = [50, 30, 20]; // 更新数据
}

在UI中绑定数据源:

PieChart({ data: this.data })

调用updateChart()方法即可刷新饼形图。

回到顶部