MPAndroidChart RadarChart collapses itself

2019-04-27 12:15发布

I have some problems with RadarChart labels. Specifically, if I use long texts (e.g. 15-20 chars), and the available space is not too big, the chart gets collapsed and the labels are positioned inside the collapsed chart (but there is clearly more space available).

I tried to use ValueFormatter for the label axis that truncates labels if they are longer than 5 chars, but as I see, the chart size calculaction is based on the full label text, as the chart got collapsed the same way I described before.

XAxis xAxis = radarChart.getXAxis();
xAxis.setValueFormatter(new XAxisValueFormatter() {
    @Override
    public String getXValue(String original, int index, ViewPortHandler viewPortHandler) {
        return original.length() > 5 ? original.substring(0, 5) + "…" : original;
    }
});

Here are some pictures to clarify the problem. The charts are displayed inside CardViews and as you can see, there is plenty of space remaining on all sides. The first two pictures are taken with the ValueFormatter set, the last two are without it.

Description

Description

Description

Description

2条回答
我欲成王,谁敢阻挡
2楼-- · 2019-04-27 13:03

Probably you are having some mistakes, here are some solutions:

1) Set your radar data after you set your RadarChart parameters then call invalidate();

2) Set AxisMinimum and AxisMaximum in radarChart.getXAxis() and radarChart.getYAxis()

3) Call yAxis.calculate(min,max) after step 2;

4) If needed use radarChart.setExtraOffsets(?,?,?,?)

I am using com.github.PhilJay:MPAndroidChart:v3.0.1

查看更多
做自己的国王
3楼-- · 2019-04-27 13:03

This is my solution

public class MyRadarChart extends RadarChart {
public MyRadarChart(Context context) {
    super(context);
}

public MyRadarChart(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyRadarChart(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void init() {
    super.init();
    setXAxisRenderer();
}

private void setXAxisRenderer(){
    this.mXAxisRenderer = new MyXAxisRendererRadarChart(mViewPortHandler,mXAxis,this);
}}

and

import android.graphics.Canvas;
import com.github.mikephil.charting.charts.RadarChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.renderer.XAxisRendererRadarChart;
import com.github.mikephil.charting.utils.FSize;
import com.github.mikephil.charting.utils.MPPointF;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;

public class MyXAxisRendererRadarChart extends XAxisRendererRadarChart {
public MyXAxisRendererRadarChart(ViewPortHandler viewPortHandler, XAxis xAxis, RadarChart chart) {
    super(viewPortHandler, xAxis, chart);
}

@Override
protected void drawLabels(Canvas c, float pos, MPPointF anchor) {
    super.drawLabels(c, pos, anchor);
}

@Override
protected void computeSize() {

    String longest = mXAxis.getLongestLabel();
    String line[] = longest.split("\n");
    if(line .length >1){
        longest = line[0];
    }

    mAxisLabelPaint.setTypeface(mXAxis.getTypeface());
    mAxisLabelPaint.setTextSize(mXAxis.getTextSize());

    final FSize labelSize = Utils.calcTextSize(mAxisLabelPaint, longest);

    final float labelWidth = labelSize.width;
    final float labelHeight = Utils.calcTextHeight(mAxisLabelPaint, "Q");

    final FSize labelRotatedSize = Utils.getSizeOfRotatedRectangleByDegrees(
            labelWidth,
            labelHeight,
            mXAxis.getLabelRotationAngle());


    mXAxis.mLabelWidth = Math.round(labelWidth);
    mXAxis.mLabelHeight = Math.round(labelHeight);
    mXAxis.mLabelRotatedWidth = Math.round(labelRotatedSize.width);
    mXAxis.mLabelRotatedHeight = Math.round(labelRotatedSize.height);

    FSize.recycleInstance(labelRotatedSize);
    FSize.recycleInstance(labelSize);

}

@Override
protected void drawLabel(Canvas c, String formattedLabel, float x, float y, MPPointF anchor, float angleDegrees) {
    String line[] = formattedLabel.split("\n");
    if(line .length >1){
        Utils.drawXAxisValue(c, line[0], x, y, mAxisLabelPaint, anchor, angleDegrees);
        Utils.drawXAxisValue(c, line[1], x + mAxisLabelPaint.getTextSize(), y + mAxisLabelPaint.getTextSize(), mAxisLabelPaint, anchor, angleDegrees);

    }else{
        super.drawLabel(c,formattedLabel,x,y,anchor,angleDegrees);
    }

}}

Now replace RadarChart in your layout file with MyRadarChart At last,setValueFormatter

 XAxis xAxis = radarChart.getXAxis();
    xAxis.setValueFormatter(new IAxisValueFormatter() {

        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            String title = "you title";
            if(title.length()>6){
                title = title.substring(0,6)+"\n"+title.substring(6,title.length());
            }
            return title;
        }
    });
查看更多
登录 后发表回答