MPAndroidChart RadarChart自行崩溃

时间:2016-05-09 10:01:04

标签: android mpandroidchart radar-chart

RadarChart标签存在问题。具体来说,如果我使用长文本(例如15-20个字符),并且可用空间不是太大,则图表会折叠并且标签位于折叠图表内(但显然有更多可用空间)。

我尝试使用ValueFormatter作为标签轴,如果它们超过5个字符,则截断标签,但正如我所见,图表大小计算基于完整标签文本,因为图表已折叠我之前描述过的方式相同。

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

以下是一些澄清问题的图片。图表显示在CardView s内,如您所见,所有侧面都有足够的空间。前两张图片是使用ValueFormatter设置拍摄的,后两张图片是没有它的。

Description

Description

Description

Description

2 个答案:

答案 0 :(得分:0)

可能你有一些错误,这里有一些解决方案:

1)设置RadarChart参数后设置雷达数据,然后拨打invalidate();

2)在AxisMinimumAxisMaximum

中设置radarChart.getXAxis()radarChart.getYAxis()

3)在第2步之后致电yAxis.calculate(min,max);

4)如果需要,请使用radarChart.setExtraOffsets(?,?,?,?)

我正在使用com.github.PhilJay:MPAndroidChart:v3.0.1

答案 1 :(得分:0)

这是我的解决方法

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

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

}}

现在将布局文件中的RadarChart替换为MyRadarChart 最后,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;
        }
    });