MpAndroidChart在限制行

时间:2016-05-24 06:33:59

标签: android mpandroidchart android-graphview

我使用的是MpAndroidChart库。我需要实现一个设计,我需要为两条限制线之间的区域着色。我附上了一张图片供参考。我尝试了多种方法,但我没有实现它。我是第一次使用这个库。任何人都可以帮助我了解如何实现这一目标。 As you can see the green shade behind the line graph. Which is the limit. I need to get that green shade

正如您可以看到折线图后面的绿色阴影。这是限制。我需要得到那绿色的阴影

提前致谢,

Anudeep Reddy。

4 个答案:

答案 0 :(得分:3)

由于这仍然是一个问题,我花了两美分。 我尝试了@HouseOfHufflepuff的解决方案,但收到了错误消息,指出我在图中使用了过多的限制线。无论如何,它似乎都可以工作,但是我认为性能不是最佳的。

因此,我实现了在后台绘制区域的子类。也许对某人有用:

public class TargetZoneCombinedChart extends CombinedChart {

    protected Paint mYAxisSafeZonePaint;
    private List<TargetZone> mTargetZones;

    public TargetZoneCombinedChart(Context context) {
        super(context);
    }

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

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

    @Override
    protected void init() {
        super.init();
        mYAxisSafeZonePaint = new Paint();
        mYAxisSafeZonePaint.setStyle(Paint.Style.FILL);
        // mGridBackgroundPaint.setColor(Color.rgb(240, 240, 240));
        mTargetZones = new ArrayList<>();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        for (TargetZone targetZone : mTargetZones) {
            // prepare coordinates
            float[] pts = new float[4];
            pts[1] = targetZone.lowerLimit;
            pts[3] = targetZone.upperLimit;
            mLeftAxisTransformer.pointValuesToPixel(pts);

            // draw
            mYAxisSafeZonePaint.setColor(targetZone.color);
            canvas.drawRect(mViewPortHandler.contentLeft(), pts[1], mViewPortHandler.contentRight(),
                    pts[3], mYAxisSafeZonePaint);
        }
        super.onDraw(canvas);
    }

    public void addTargetZone(TargetZone targetZone){
        mTargetZones.add(targetZone);
    }

    public List<TargetZone> getTargetZones(){
        return mTargetZones;
    }

    public void clearTargetZones(){
        mTargetZones = new ArrayList<>();
    }

    public static class TargetZone {
        public final int color;
        public final float lowerLimit;
        public final float upperLimit;

        public TargetZone(int color, float lowerLimit, float upperLimit) {
            this.color = color;
            this.lowerLimit = lowerLimit;
            this.upperLimit = upperLimit;
        }
    }
}

要添加区域,您只需要添加目标区域对象:

float rangeHigh = 180f;
float rangeLow = 80f;

chart.addTargetZone(new TargetZoneCombinedChart.TargetZone(                Color.parseColor("#33b5eb45"),rangeLow,rangeHigh));

其中范围是左轴的y值。

答案 1 :(得分:1)

我认为没有直接的方法来实现这一目标,但这种解决方法可以帮助您:

LimitLine ll = new LimitLine(lowerLimit, "Systolic range");
ll.setLineColor(Color.GREEN);
ll.setLineWidth(upperLimit - lowerLimit);

ll.setTextColor(Color.WHITE);
ll.setTextSize(12f);

chart.getAxisLeft().setDrawLimitLinesBehindData(true);

这里重要的是方法setDrawLimitLinesBehindData(true)

与往常一样,documentation中提供了所有信息。

答案 2 :(得分:1)

这可以通过对图表类(例如LineChart)进行子类化,然后重写onDraw()方法来完成。在重写的onDraw()中,您可以直接在画布上绘制所需的矩形,然后调用super.onDraw()来完成图表的渲染。

有一个如何在MP Android Github上执行此操作的示例(见下文)。我按照示例中的代码进行操作,对我来说效果很好。

https://github.com/PhilJay/MPAndroidChart/issues/485

答案 3 :(得分:1)

我有同样的问题但是在不必继承LineChart的情况下达成了不同的解决方法。使用画布绘制矩形可以工作,但您必须将图表坐标转换为画布坐标。您不能使用单个限制线,因为线的宽度有限制。我使用的解决方法是简单地遍历限制线以在我的范围内创建一个矩形。

    float increment = (rangeHigh - rangeLow) / 20;
    float metricLine = rangeLow;

    for(int i = 0; i < 20; i++) {
        LimitLine llRange = new LimitLine(metricLine, "");
        llRange.setLineColor(Color.parseColor("#b5eb45"));
        llRange.setLineWidth(10f);
        leftAxis.addLimitLine(llRange);
        metricLine = metricLine + increment;
    }

graph