Search in sources :

Example 11 with Legend

use of com.github.mikephil.charting.components.Legend in project MPAndroidChart by PhilJay.

the class HalfPieChartActivity method onCreate.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_piechart_half);
    mChart = (PieChart) findViewById(R.id.chart1);
    mChart.setBackgroundColor(Color.WHITE);
    moveOffScreen();
    mChart.setUsePercentValues(true);
    mChart.getDescription().setEnabled(false);
    mChart.setCenterTextTypeface(mTfLight);
    mChart.setCenterText(generateCenterSpannableText());
    mChart.setDrawHoleEnabled(true);
    mChart.setHoleColor(Color.WHITE);
    mChart.setTransparentCircleColor(Color.WHITE);
    mChart.setTransparentCircleAlpha(110);
    mChart.setHoleRadius(58f);
    mChart.setTransparentCircleRadius(61f);
    mChart.setDrawCenterText(true);
    mChart.setRotationEnabled(false);
    mChart.setHighlightPerTapEnabled(true);
    // HALF CHART
    mChart.setMaxAngle(180f);
    mChart.setRotationAngle(180f);
    mChart.setCenterTextOffset(0, -20);
    setData(4, 100);
    mChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
    Legend l = mChart.getLegend();
    l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
    l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
    l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
    l.setDrawInside(false);
    l.setXEntrySpace(7f);
    l.setYEntrySpace(0f);
    l.setYOffset(0f);
    // entry label styling
    mChart.setEntryLabelColor(Color.WHITE);
    mChart.setEntryLabelTypeface(mTfRegular);
    mChart.setEntryLabelTextSize(12f);
}
Also used : Legend(com.github.mikephil.charting.components.Legend)

Example 12 with Legend

use of com.github.mikephil.charting.components.Legend in project MPAndroidChart by PhilJay.

the class InvertedLineChartActivity method onCreate.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_linechart);
    tvX = (TextView) findViewById(R.id.tvXMax);
    tvY = (TextView) findViewById(R.id.tvYMax);
    mSeekBarX = (SeekBar) findViewById(R.id.seekBar1);
    mSeekBarY = (SeekBar) findViewById(R.id.seekBar2);
    mSeekBarX.setProgress(45);
    mSeekBarY.setProgress(100);
    mSeekBarY.setOnSeekBarChangeListener(this);
    mSeekBarX.setOnSeekBarChangeListener(this);
    mChart = (LineChart) findViewById(R.id.chart1);
    mChart.setOnChartValueSelectedListener(this);
    mChart.setDrawGridBackground(false);
    // no description text
    mChart.getDescription().setEnabled(false);
    // enable touch gestures
    mChart.setTouchEnabled(true);
    // enable scaling and dragging
    mChart.setDragEnabled(true);
    mChart.setScaleEnabled(true);
    // if disabled, scaling can be done on x- and y-axis separately
    mChart.setPinchZoom(true);
    // set an alternative background color
    // mChart.setBackgroundColor(Color.GRAY);
    // create a custom MarkerView (extend MarkerView) and specify the layout
    // to use for it
    MyMarkerView mv = new MyMarkerView(this, R.layout.custom_marker_view);
    // For bounds control
    mv.setChartView(mChart);
    // Set the marker to the chart
    mChart.setMarker(mv);
    XAxis xl = mChart.getXAxis();
    xl.setAvoidFirstLastClipping(true);
    xl.setAxisMinimum(0f);
    YAxis leftAxis = mChart.getAxisLeft();
    leftAxis.setInverted(true);
    // this replaces setStartAtZero(true)
    leftAxis.setAxisMinimum(0f);
    YAxis rightAxis = mChart.getAxisRight();
    rightAxis.setEnabled(false);
    // add data
    setData(25, 50);
    // // restrain the maximum scale-out factor
    // mChart.setScaleMinima(3f, 3f);
    //
    // // center the view to a specific position inside the chart
    // mChart.centerViewPort(10, 50);
    // get the legend (only possible after setting data)
    Legend l = mChart.getLegend();
    // modify the legend ...
    l.setForm(LegendForm.LINE);
    // dont forget to refresh the drawing
    mChart.invalidate();
}
Also used : Legend(com.github.mikephil.charting.components.Legend) MyMarkerView(com.xxmassdeveloper.mpchartexample.custom.MyMarkerView) XAxis(com.github.mikephil.charting.components.XAxis) YAxis(com.github.mikephil.charting.components.YAxis)

Example 13 with Legend

use of com.github.mikephil.charting.components.Legend in project MPAndroidChart by PhilJay.

the class LineChartActivity1 method onCreate.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_linechart);
    tvX = (TextView) findViewById(R.id.tvXMax);
    tvY = (TextView) findViewById(R.id.tvYMax);
    mSeekBarX = (SeekBar) findViewById(R.id.seekBar1);
    mSeekBarY = (SeekBar) findViewById(R.id.seekBar2);
    mSeekBarX.setProgress(45);
    mSeekBarY.setProgress(100);
    mSeekBarY.setOnSeekBarChangeListener(this);
    mSeekBarX.setOnSeekBarChangeListener(this);
    mChart = (LineChart) findViewById(R.id.chart1);
    mChart.setOnChartGestureListener(this);
    mChart.setOnChartValueSelectedListener(this);
    mChart.setDrawGridBackground(false);
    // no description text
    mChart.getDescription().setEnabled(false);
    // enable touch gestures
    mChart.setTouchEnabled(true);
    // enable scaling and dragging
    mChart.setDragEnabled(true);
    mChart.setScaleEnabled(true);
    // mChart.setScaleXEnabled(true);
    // mChart.setScaleYEnabled(true);
    // if disabled, scaling can be done on x- and y-axis separately
    mChart.setPinchZoom(true);
    // set an alternative background color
    // mChart.setBackgroundColor(Color.GRAY);
    // create a custom MarkerView (extend MarkerView) and specify the layout
    // to use for it
    MyMarkerView mv = new MyMarkerView(this, R.layout.custom_marker_view);
    // For bounds control
    mv.setChartView(mChart);
    // Set the marker to the chart
    mChart.setMarker(mv);
    // x-axis limit line
    LimitLine llXAxis = new LimitLine(10f, "Index 10");
    llXAxis.setLineWidth(4f);
    llXAxis.enableDashedLine(10f, 10f, 0f);
    llXAxis.setLabelPosition(LimitLabelPosition.RIGHT_BOTTOM);
    llXAxis.setTextSize(10f);
    XAxis xAxis = mChart.getXAxis();
    xAxis.enableGridDashedLine(10f, 10f, 0f);
    //xAxis.setValueFormatter(new MyCustomXAxisValueFormatter());
    //xAxis.addLimitLine(llXAxis); // add x-axis limit line
    Typeface tf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
    LimitLine ll1 = new LimitLine(150f, "Upper Limit");
    ll1.setLineWidth(4f);
    ll1.enableDashedLine(10f, 10f, 0f);
    ll1.setLabelPosition(LimitLabelPosition.RIGHT_TOP);
    ll1.setTextSize(10f);
    ll1.setTypeface(tf);
    LimitLine ll2 = new LimitLine(-30f, "Lower Limit");
    ll2.setLineWidth(4f);
    ll2.enableDashedLine(10f, 10f, 0f);
    ll2.setLabelPosition(LimitLabelPosition.RIGHT_BOTTOM);
    ll2.setTextSize(10f);
    ll2.setTypeface(tf);
    YAxis leftAxis = mChart.getAxisLeft();
    // reset all limit lines to avoid overlapping lines
    leftAxis.removeAllLimitLines();
    leftAxis.addLimitLine(ll1);
    leftAxis.addLimitLine(ll2);
    leftAxis.setAxisMaximum(200f);
    leftAxis.setAxisMinimum(-50f);
    //leftAxis.setYOffset(20f);
    leftAxis.enableGridDashedLine(10f, 10f, 0f);
    leftAxis.setDrawZeroLine(false);
    // limit lines are drawn behind data (and not on top)
    leftAxis.setDrawLimitLinesBehindData(true);
    mChart.getAxisRight().setEnabled(false);
    //mChart.getViewPortHandler().setMaximumScaleY(2f);
    //mChart.getViewPortHandler().setMaximumScaleX(2f);
    // add data
    setData(45, 100);
    //        mChart.setVisibleXRange(20);
    //        mChart.setVisibleYRange(20f, AxisDependency.LEFT);
    //        mChart.centerViewTo(20, 50, AxisDependency.LEFT);
    mChart.animateX(2500);
    //mChart.invalidate();
    // get the legend (only possible after setting data)
    Legend l = mChart.getLegend();
    // modify the legend ...
    l.setForm(LegendForm.LINE);
// // dont forget to refresh the drawing
// mChart.invalidate();
}
Also used : Legend(com.github.mikephil.charting.components.Legend) Typeface(android.graphics.Typeface) LimitLine(com.github.mikephil.charting.components.LimitLine) MyMarkerView(com.xxmassdeveloper.mpchartexample.custom.MyMarkerView) XAxis(com.github.mikephil.charting.components.XAxis) YAxis(com.github.mikephil.charting.components.YAxis)

Example 14 with Legend

use of com.github.mikephil.charting.components.Legend in project MPAndroidChart by PhilJay.

the class LegendRenderer method renderLegend.

public void renderLegend(Canvas c) {
    if (!mLegend.isEnabled())
        return;
    Typeface tf = mLegend.getTypeface();
    if (tf != null)
        mLegendLabelPaint.setTypeface(tf);
    mLegendLabelPaint.setTextSize(mLegend.getTextSize());
    mLegendLabelPaint.setColor(mLegend.getTextColor());
    float labelLineHeight = Utils.getLineHeight(mLegendLabelPaint, legendFontMetrics);
    float labelLineSpacing = Utils.getLineSpacing(mLegendLabelPaint, legendFontMetrics) + Utils.convertDpToPixel(mLegend.getYEntrySpace());
    float formYOffset = labelLineHeight - Utils.calcTextHeight(mLegendLabelPaint, "ABC") / 2.f;
    LegendEntry[] entries = mLegend.getEntries();
    float formToTextSpace = Utils.convertDpToPixel(mLegend.getFormToTextSpace());
    float xEntrySpace = Utils.convertDpToPixel(mLegend.getXEntrySpace());
    Legend.LegendOrientation orientation = mLegend.getOrientation();
    Legend.LegendHorizontalAlignment horizontalAlignment = mLegend.getHorizontalAlignment();
    Legend.LegendVerticalAlignment verticalAlignment = mLegend.getVerticalAlignment();
    Legend.LegendDirection direction = mLegend.getDirection();
    float defaultFormSize = Utils.convertDpToPixel(mLegend.getFormSize());
    // space between the entries
    float stackSpace = Utils.convertDpToPixel(mLegend.getStackSpace());
    float yoffset = mLegend.getYOffset();
    float xoffset = mLegend.getXOffset();
    float originPosX = 0.f;
    switch(horizontalAlignment) {
        case LEFT:
            if (orientation == Legend.LegendOrientation.VERTICAL)
                originPosX = xoffset;
            else
                originPosX = mViewPortHandler.contentLeft() + xoffset;
            if (direction == Legend.LegendDirection.RIGHT_TO_LEFT)
                originPosX += mLegend.mNeededWidth;
            break;
        case RIGHT:
            if (orientation == Legend.LegendOrientation.VERTICAL)
                originPosX = mViewPortHandler.getChartWidth() - xoffset;
            else
                originPosX = mViewPortHandler.contentRight() - xoffset;
            if (direction == Legend.LegendDirection.LEFT_TO_RIGHT)
                originPosX -= mLegend.mNeededWidth;
            break;
        case CENTER:
            if (orientation == Legend.LegendOrientation.VERTICAL)
                originPosX = mViewPortHandler.getChartWidth() / 2.f;
            else
                originPosX = mViewPortHandler.contentLeft() + mViewPortHandler.contentWidth() / 2.f;
            originPosX += (direction == Legend.LegendDirection.LEFT_TO_RIGHT ? +xoffset : -xoffset);
            // So here we offset the vertical ones only.
            if (orientation == Legend.LegendOrientation.VERTICAL) {
                originPosX += (direction == Legend.LegendDirection.LEFT_TO_RIGHT ? -mLegend.mNeededWidth / 2.0 + xoffset : mLegend.mNeededWidth / 2.0 - xoffset);
            }
            break;
    }
    switch(orientation) {
        case HORIZONTAL:
            {
                List<FSize> calculatedLineSizes = mLegend.getCalculatedLineSizes();
                List<FSize> calculatedLabelSizes = mLegend.getCalculatedLabelSizes();
                List<Boolean> calculatedLabelBreakPoints = mLegend.getCalculatedLabelBreakPoints();
                float posX = originPosX;
                float posY = 0.f;
                switch(verticalAlignment) {
                    case TOP:
                        posY = yoffset;
                        break;
                    case BOTTOM:
                        posY = mViewPortHandler.getChartHeight() - yoffset - mLegend.mNeededHeight;
                        break;
                    case CENTER:
                        posY = (mViewPortHandler.getChartHeight() - mLegend.mNeededHeight) / 2.f + yoffset;
                        break;
                }
                int lineIndex = 0;
                for (int i = 0, count = entries.length; i < count; i++) {
                    LegendEntry e = entries[i];
                    boolean drawingForm = e.form != Legend.LegendForm.NONE;
                    float formSize = Float.isNaN(e.formSize) ? defaultFormSize : Utils.convertDpToPixel(e.formSize);
                    if (i < calculatedLabelBreakPoints.size() && calculatedLabelBreakPoints.get(i)) {
                        posX = originPosX;
                        posY += labelLineHeight + labelLineSpacing;
                    }
                    if (posX == originPosX && horizontalAlignment == Legend.LegendHorizontalAlignment.CENTER && lineIndex < calculatedLineSizes.size()) {
                        posX += (direction == Legend.LegendDirection.RIGHT_TO_LEFT ? calculatedLineSizes.get(lineIndex).width : -calculatedLineSizes.get(lineIndex).width) / 2.f;
                        lineIndex++;
                    }
                    // grouped forms have null labels
                    boolean isStacked = e.label == null;
                    if (drawingForm) {
                        if (direction == Legend.LegendDirection.RIGHT_TO_LEFT)
                            posX -= formSize;
                        drawForm(c, posX, posY + formYOffset, e, mLegend);
                        if (direction == Legend.LegendDirection.LEFT_TO_RIGHT)
                            posX += formSize;
                    }
                    if (!isStacked) {
                        if (drawingForm)
                            posX += direction == Legend.LegendDirection.RIGHT_TO_LEFT ? -formToTextSpace : formToTextSpace;
                        if (direction == Legend.LegendDirection.RIGHT_TO_LEFT)
                            posX -= calculatedLabelSizes.get(i).width;
                        drawLabel(c, posX, posY + labelLineHeight, e.label);
                        if (direction == Legend.LegendDirection.LEFT_TO_RIGHT)
                            posX += calculatedLabelSizes.get(i).width;
                        posX += direction == Legend.LegendDirection.RIGHT_TO_LEFT ? -xEntrySpace : xEntrySpace;
                    } else
                        posX += direction == Legend.LegendDirection.RIGHT_TO_LEFT ? -stackSpace : stackSpace;
                }
                break;
            }
        case VERTICAL:
            {
                // contains the stacked legend size in pixels
                float stack = 0f;
                boolean wasStacked = false;
                float posY = 0.f;
                switch(verticalAlignment) {
                    case TOP:
                        posY = (horizontalAlignment == Legend.LegendHorizontalAlignment.CENTER ? 0.f : mViewPortHandler.contentTop());
                        posY += yoffset;
                        break;
                    case BOTTOM:
                        posY = (horizontalAlignment == Legend.LegendHorizontalAlignment.CENTER ? mViewPortHandler.getChartHeight() : mViewPortHandler.contentBottom());
                        posY -= mLegend.mNeededHeight + yoffset;
                        break;
                    case CENTER:
                        posY = mViewPortHandler.getChartHeight() / 2.f - mLegend.mNeededHeight / 2.f + mLegend.getYOffset();
                        break;
                }
                for (int i = 0; i < entries.length; i++) {
                    LegendEntry e = entries[i];
                    boolean drawingForm = e.form != Legend.LegendForm.NONE;
                    float formSize = Float.isNaN(e.formSize) ? defaultFormSize : Utils.convertDpToPixel(e.formSize);
                    float posX = originPosX;
                    if (drawingForm) {
                        if (direction == Legend.LegendDirection.LEFT_TO_RIGHT)
                            posX += stack;
                        else
                            posX -= formSize - stack;
                        drawForm(c, posX, posY + formYOffset, e, mLegend);
                        if (direction == Legend.LegendDirection.LEFT_TO_RIGHT)
                            posX += formSize;
                    }
                    if (e.label != null) {
                        if (drawingForm && !wasStacked)
                            posX += direction == Legend.LegendDirection.LEFT_TO_RIGHT ? formToTextSpace : -formToTextSpace;
                        else if (wasStacked)
                            posX = originPosX;
                        if (direction == Legend.LegendDirection.RIGHT_TO_LEFT)
                            posX -= Utils.calcTextWidth(mLegendLabelPaint, e.label);
                        if (!wasStacked) {
                            drawLabel(c, posX, posY + labelLineHeight, e.label);
                        } else {
                            posY += labelLineHeight + labelLineSpacing;
                            drawLabel(c, posX, posY + labelLineHeight, e.label);
                        }
                        // make a step down
                        posY += labelLineHeight + labelLineSpacing;
                        stack = 0f;
                    } else {
                        stack += formSize + stackSpace;
                        wasStacked = true;
                    }
                }
                break;
            }
    }
}
Also used : Legend(com.github.mikephil.charting.components.Legend) Typeface(android.graphics.Typeface) LegendEntry(com.github.mikephil.charting.components.LegendEntry) ArrayList(java.util.ArrayList) List(java.util.List)

Example 15 with Legend

use of com.github.mikephil.charting.components.Legend in project MPAndroidChart by PhilJay.

the class LegendRenderer method drawForm.

/**
     * Draws the Legend-form at the given position with the color at the given
     * index.
     *
     * @param c      canvas to draw with
     * @param x      position
     * @param y      position
     * @param entry  the entry to render
     * @param legend the legend context
     */
protected void drawForm(Canvas c, float x, float y, LegendEntry entry, Legend legend) {
    if (entry.formColor == ColorTemplate.COLOR_SKIP || entry.formColor == ColorTemplate.COLOR_NONE || entry.formColor == 0)
        return;
    int restoreCount = c.save();
    Legend.LegendForm form = entry.form;
    if (form == Legend.LegendForm.DEFAULT)
        form = legend.getForm();
    mLegendFormPaint.setColor(entry.formColor);
    final float formSize = Utils.convertDpToPixel(Float.isNaN(entry.formSize) ? legend.getFormSize() : entry.formSize);
    final float half = formSize / 2f;
    switch(form) {
        case NONE:
            // Do nothing
            break;
        case EMPTY:
            // Do not draw, but keep space for the form
            break;
        case DEFAULT:
        case CIRCLE:
            mLegendFormPaint.setStyle(Paint.Style.FILL);
            c.drawCircle(x + half, y, half, mLegendFormPaint);
            break;
        case SQUARE:
            mLegendFormPaint.setStyle(Paint.Style.FILL);
            c.drawRect(x, y - half, x + formSize, y + half, mLegendFormPaint);
            break;
        case LINE:
            {
                final float formLineWidth = Utils.convertDpToPixel(Float.isNaN(entry.formLineWidth) ? legend.getFormLineWidth() : entry.formLineWidth);
                final DashPathEffect formLineDashEffect = entry.formLineDashEffect == null ? legend.getFormLineDashEffect() : entry.formLineDashEffect;
                mLegendFormPaint.setStyle(Paint.Style.STROKE);
                mLegendFormPaint.setStrokeWidth(formLineWidth);
                mLegendFormPaint.setPathEffect(formLineDashEffect);
                mLineFormPath.reset();
                mLineFormPath.moveTo(x, y);
                mLineFormPath.lineTo(x + formSize, y);
                c.drawPath(mLineFormPath, mLegendFormPaint);
            }
            break;
    }
    c.restoreToCount(restoreCount);
}
Also used : Legend(com.github.mikephil.charting.components.Legend) DashPathEffect(android.graphics.DashPathEffect) Paint(android.graphics.Paint)

Aggregations

Legend (com.github.mikephil.charting.components.Legend)31 XAxis (com.github.mikephil.charting.components.XAxis)21 YAxis (com.github.mikephil.charting.components.YAxis)19 Typeface (android.graphics.Typeface)7 IAxisValueFormatter (com.github.mikephil.charting.formatter.IAxisValueFormatter)6 View (android.view.View)5 AxisBase (com.github.mikephil.charting.components.AxisBase)5 MyMarkerView (com.xxmassdeveloper.mpchartexample.custom.MyMarkerView)5 ArrayList (java.util.ArrayList)3 Paint (android.graphics.Paint)2 LineData (com.github.mikephil.charting.data.LineData)2 LineDataSet (com.github.mikephil.charting.data.LineDataSet)2 MyAxisValueFormatter (com.xxmassdeveloper.mpchartexample.custom.MyAxisValueFormatter)2 ValueAnimator (android.animation.ValueAnimator)1 AnimatorUpdateListener (android.animation.ValueAnimator.AnimatorUpdateListener)1 DashPathEffect (android.graphics.DashPathEffect)1 FrameLayout (android.widget.FrameLayout)1 TextView (android.widget.TextView)1 ChartAnimator (com.github.mikephil.charting.animation.ChartAnimator)1 BarChart (com.github.mikephil.charting.charts.BarChart)1