HarmonyOS鸿蒙Next中mpchart绘制的图形怎么去掉上下左右边距

HarmonyOS鸿蒙Next中mpchart绘制的图形怎么去掉上下左右边距

想要的效果是,图形的最大值和最小值绘制的时候紧贴画布的最顶部和最底部。

测试代码如下,已经设置了this.model.setExtraOffsets(0, 0, 0, 0)没有效果的~,有什么办法吗!

import {
  JArrayList,
  XAxis,
  YAxis,
  Description,
  Legend,
  EntryOhos,
  LineDataSet,
  ILineDataSet,
  LineData,
  Mode,
  LineChartModel,
  ChartColorStop,
  LegendForm,
  LineChart
} from '@ohos/mpchart';

@Entry
@Component
struct GradientLineChart {
  private model: LineChartModel = new LineChartModel();
  private dataSet: LineDataSet | null = null;

  aboutToAppear() {
    this.initChart();
  }

  private initChart() {

    // 图表描述
    const desc: Description | null = this.model.getDescription();
    if (desc) {
      desc.setEnabled(false);
    }

    // 图例
    const legend: Legend | null = this.model.getLegend();
    if (legend) {
      legend.setEnabled(false);
      legend.setForm(LegendForm.LINE);
    }

    const leftAxis: YAxis | null = this.model.getAxisLeft();
    if (leftAxis) {
      leftAxis.setEnabled(false);
    }

    const rightAxis: YAxis | null = this.model.getAxisRight();
    if (rightAxis) {
      rightAxis.setEnabled(false);
    }

    const xAxis: XAxis | null = this.model.getXAxis();
    if (xAxis) {
      xAxis.setEnabled(false);
    }

    // 图表交互设置
    this.model.setTouchEnabled(false);
    this.model.setDragEnabled(false);
    this.model.setScaleEnabled(false);
    this.model.setPinchZoom(false);
    this.model.setDrawGridBackground(false);
    // this.model.setMaxVisibleValueCount(60);
    this.model.setExtraOffsets(0, 0, 0, 0);

    // 设置数据
    const lineData = this.createLineData();
    this.model.setData(lineData);
    this.model.setVisibleXRangeMaximum(50);
    this.model.getXAxis()?.setAxisMinimum(0); // 从0开始
    this.model.getXAxis()?.setAxisMaximum(49); // 到241结束
  }

  private createLineData(): LineData {
    const entries: JArrayList<EntryOhos> = new JArrayList<EntryOhos>();
    for (let i = 0; i < 10; i++) {
      let y = [100, 120, 120, 90, 90, 150, 160, 160, 50, 50][i]
      entries.add(new EntryOhos(i, y));
    }

    this.dataSet = new LineDataSet(entries, '');
    this.dataSet.setMode(Mode.CUBIC_BEZIER);
    this.dataSet.setLineWidth(2);
    this.dataSet.setColorByColor(Color.Blue);
    this.dataSet.setHighLightColor(Color.Red);
    this.dataSet.setDrawCircles(false);
    this.dataSet.setDrawCircleHole(false);
    this.dataSet.setCircleColor(Color.White);
    this.dataSet.setCircleRadius(4);
    this.dataSet.setCircleHoleRadius(2);
    this.dataSet.setDrawValues(false);

    // 渐变填充区域
    const gradient: JArrayList<ChartColorStop> = new JArrayList<ChartColorStop>();
    gradient.add(["#FF42A5F5", 0.0]); // 顶部深色
    gradient.add(["#8042A5F5", 0.5]); // 中部透明度50%
    gradient.add(["#0042A5F5", 1.0]); // 底部透明
    this.dataSet.setGradientFillColor(gradient);
    this.dataSet.setDrawFilled(true);

    const sets: JArrayList<ILineDataSet> = new JArrayList<ILineDataSet>();
    sets.add(this.dataSet);

    return new LineData(sets);
  }

  build() {
    Column() {
      Text('折线图示例')
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 12 })

      LineChart({ model: this.model })
        .width('100%')
        .height('60%')
        .backgroundColor('#ff5500')
    }.padding(20)
  }
}

更多关于HarmonyOS鸿蒙Next中mpchart绘制的图形怎么去掉上下左右边距的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

mpchart中的setMinOffset

更多关于HarmonyOS鸿蒙Next中mpchart绘制的图形怎么去掉上下左右边距的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


找到解决办法了

this.model.setMinOffset(0);

在HarmonyOS Next中使用MPChart时,可通过设置ViewPort参数去除边距。调用chart.setViewPortOffsets(0, 0, 0, 0)将四周边距设为0。对于Axis,使用axis.setAxisMinimum()axis.setAxisMaximum()精确控制坐标轴范围,避免留白。Legend可通过legend.setEnabled(false)直接关闭。若需保留图例但调整位置,使用legend.setVerticalAlignment()legend.setHorizontalAlignment()重定位。数据标签的边距需通过dataSet.setDrawValues(false)关闭或调整标签绘制偏移量。

在HarmonyOS Next中使用MPChart绘制图表时,要去掉上下左右的边距,除了设置setExtraOffsets(0,0,0,0)外,还需要调整Y轴的范围设置。以下是关键修改点:

  1. 在initChart方法中添加Y轴范围设置:
const leftAxis: YAxis | null = this.model.getAxisLeft();
if (leftAxis) {
    leftAxis.setAxisMinimum(0);  // 设置Y轴最小值
    leftAxis.setAxisMaximum(160); // 设置Y轴最大值(根据你的数据最大值)
}
  1. 确保已经禁用所有不需要的图表元素:
this.model.setExtraOffsets(0, 0, 0, 0);
this.model.setDrawBorders(false); // 禁用图表边框
  1. 对于LineDataSet也需要设置不绘制高亮线:
this.dataSet.setDrawHorizontalHighlightIndicator(false);
this.dataSet.setDrawVerticalHighlightIndicator(false);

这样设置后,图表会紧贴画布边缘显示。注意Y轴的最大值需要根据实际数据范围调整,示例中设置为160是因为你的测试数据最大值为160。

回到顶部