MPAndroidChart RadarChart collapses itself

喜夏-厌秋 提交于 2019-12-22 05:09:30

问题


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.


回答1:


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




回答2:


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;
        }
    });


来源:https://stackoverflow.com/questions/37112855/mpandroidchart-radarchart-collapses-itself

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!