Search in sources :

Example 31 with MPPointF

use of com.github.mikephil.charting.utils.MPPointF in project MPAndroidChart by PhilJay.

the class PieChartRenderer method drawDataSet.

protected void drawDataSet(Canvas c, IPieDataSet dataSet) {
    float angle = 0;
    float rotationAngle = mChart.getRotationAngle();
    float phaseX = mAnimator.getPhaseX();
    float phaseY = mAnimator.getPhaseY();
    final RectF circleBox = mChart.getCircleBox();
    final int entryCount = dataSet.getEntryCount();
    final float[] drawAngles = mChart.getDrawAngles();
    final MPPointF center = mChart.getCenterCircleBox();
    final float radius = mChart.getRadius();
    final boolean drawInnerArc = mChart.isDrawHoleEnabled() && !mChart.isDrawSlicesUnderHoleEnabled();
    final float userInnerRadius = drawInnerArc ? radius * (mChart.getHoleRadius() / 100.f) : 0.f;
    int visibleAngleCount = 0;
    for (int j = 0; j < entryCount; j++) {
        // draw only if the value is greater than zero
        if ((Math.abs(dataSet.getEntryForIndex(j).getY()) > Utils.FLOAT_EPSILON)) {
            visibleAngleCount++;
        }
    }
    final float sliceSpace = visibleAngleCount <= 1 ? 0.f : getSliceSpace(dataSet);
    for (int j = 0; j < entryCount; j++) {
        float sliceAngle = drawAngles[j];
        float innerRadius = userInnerRadius;
        Entry e = dataSet.getEntryForIndex(j);
        // draw only if the value is greater than zero
        if ((Math.abs(e.getY()) > Utils.FLOAT_EPSILON)) {
            if (!mChart.needsHighlight(j)) {
                final boolean accountForSliceSpacing = sliceSpace > 0.f && sliceAngle <= 180.f;
                mRenderPaint.setColor(dataSet.getColor(j));
                final float sliceSpaceAngleOuter = visibleAngleCount == 1 ? 0.f : sliceSpace / (Utils.FDEG2RAD * radius);
                final float startAngleOuter = rotationAngle + (angle + sliceSpaceAngleOuter / 2.f) * phaseY;
                float sweepAngleOuter = (sliceAngle - sliceSpaceAngleOuter) * phaseY;
                if (sweepAngleOuter < 0.f) {
                    sweepAngleOuter = 0.f;
                }
                mPathBuffer.reset();
                float arcStartPointX = center.x + radius * (float) Math.cos(startAngleOuter * Utils.FDEG2RAD);
                float arcStartPointY = center.y + radius * (float) Math.sin(startAngleOuter * Utils.FDEG2RAD);
                if (sweepAngleOuter >= 360.f && sweepAngleOuter % 360f <= Utils.FLOAT_EPSILON) {
                    // Android is doing "mod 360"
                    mPathBuffer.addCircle(center.x, center.y, radius, Path.Direction.CW);
                } else {
                    mPathBuffer.moveTo(arcStartPointX, arcStartPointY);
                    mPathBuffer.arcTo(circleBox, startAngleOuter, sweepAngleOuter);
                }
                // API < 21 does not receive floats in addArc, but a RectF
                mInnerRectBuffer.set(center.x - innerRadius, center.y - innerRadius, center.x + innerRadius, center.y + innerRadius);
                if (drawInnerArc && (innerRadius > 0.f || accountForSliceSpacing)) {
                    if (accountForSliceSpacing) {
                        float minSpacedRadius = calculateMinimumRadiusForSpacedSlice(center, radius, sliceAngle * phaseY, arcStartPointX, arcStartPointY, startAngleOuter, sweepAngleOuter);
                        if (minSpacedRadius < 0.f)
                            minSpacedRadius = -minSpacedRadius;
                        innerRadius = Math.max(innerRadius, minSpacedRadius);
                    }
                    final float sliceSpaceAngleInner = visibleAngleCount == 1 || innerRadius == 0.f ? 0.f : sliceSpace / (Utils.FDEG2RAD * innerRadius);
                    final float startAngleInner = rotationAngle + (angle + sliceSpaceAngleInner / 2.f) * phaseY;
                    float sweepAngleInner = (sliceAngle - sliceSpaceAngleInner) * phaseY;
                    if (sweepAngleInner < 0.f) {
                        sweepAngleInner = 0.f;
                    }
                    final float endAngleInner = startAngleInner + sweepAngleInner;
                    if (sweepAngleOuter >= 360.f && sweepAngleOuter % 360f <= Utils.FLOAT_EPSILON) {
                        // Android is doing "mod 360"
                        mPathBuffer.addCircle(center.x, center.y, innerRadius, Path.Direction.CCW);
                    } else {
                        mPathBuffer.lineTo(center.x + innerRadius * (float) Math.cos(endAngleInner * Utils.FDEG2RAD), center.y + innerRadius * (float) Math.sin(endAngleInner * Utils.FDEG2RAD));
                        mPathBuffer.arcTo(mInnerRectBuffer, endAngleInner, -sweepAngleInner);
                    }
                } else {
                    if (sweepAngleOuter % 360f > Utils.FLOAT_EPSILON) {
                        if (accountForSliceSpacing) {
                            float angleMiddle = startAngleOuter + sweepAngleOuter / 2.f;
                            float sliceSpaceOffset = calculateMinimumRadiusForSpacedSlice(center, radius, sliceAngle * phaseY, arcStartPointX, arcStartPointY, startAngleOuter, sweepAngleOuter);
                            float arcEndPointX = center.x + sliceSpaceOffset * (float) Math.cos(angleMiddle * Utils.FDEG2RAD);
                            float arcEndPointY = center.y + sliceSpaceOffset * (float) Math.sin(angleMiddle * Utils.FDEG2RAD);
                            mPathBuffer.lineTo(arcEndPointX, arcEndPointY);
                        } else {
                            mPathBuffer.lineTo(center.x, center.y);
                        }
                    }
                }
                mPathBuffer.close();
                mBitmapCanvas.drawPath(mPathBuffer, mRenderPaint);
            }
        }
        angle += sliceAngle * phaseX;
    }
    MPPointF.recycleInstance(center);
}
Also used : RectF(android.graphics.RectF) Entry(com.github.mikephil.charting.data.Entry) PieEntry(com.github.mikephil.charting.data.PieEntry) MPPointF(com.github.mikephil.charting.utils.MPPointF) TextPaint(android.text.TextPaint) Paint(android.graphics.Paint)

Example 32 with MPPointF

use of com.github.mikephil.charting.utils.MPPointF in project MPAndroidChart by PhilJay.

the class RadarChartRenderer method drawWeb.

protected void drawWeb(Canvas c) {
    float sliceangle = mChart.getSliceAngle();
    // calculate the factor that is needed for transforming the value to
    // pixels
    float factor = mChart.getFactor();
    float rotationangle = mChart.getRotationAngle();
    MPPointF center = mChart.getCenterOffsets();
    // draw the web lines that come from the center
    mWebPaint.setStrokeWidth(mChart.getWebLineWidth());
    mWebPaint.setColor(mChart.getWebColor());
    mWebPaint.setAlpha(mChart.getWebAlpha());
    final int xIncrements = 1 + mChart.getSkipWebLineCount();
    int maxEntryCount = mChart.getData().getMaxEntryCountSet().getEntryCount();
    MPPointF p = MPPointF.getInstance(0, 0);
    for (int i = 0; i < maxEntryCount; i += xIncrements) {
        Utils.getPosition(center, mChart.getYRange() * factor, sliceangle * i + rotationangle, p);
        c.drawLine(center.x, center.y, p.x, p.y, mWebPaint);
    }
    MPPointF.recycleInstance(p);
    // draw the inner-web
    mWebPaint.setStrokeWidth(mChart.getWebLineWidthInner());
    mWebPaint.setColor(mChart.getWebColorInner());
    mWebPaint.setAlpha(mChart.getWebAlpha());
    int labelCount = mChart.getYAxis().mEntryCount;
    MPPointF p1out = MPPointF.getInstance(0, 0);
    MPPointF p2out = MPPointF.getInstance(0, 0);
    for (int j = 0; j < labelCount; j++) {
        for (int i = 0; i < mChart.getData().getEntryCount(); i++) {
            float r = (mChart.getYAxis().mEntries[j] - mChart.getYChartMin()) * factor;
            Utils.getPosition(center, r, sliceangle * i + rotationangle, p1out);
            Utils.getPosition(center, r, sliceangle * (i + 1) + rotationangle, p2out);
            c.drawLine(p1out.x, p1out.y, p2out.x, p2out.y, mWebPaint);
        }
    }
    MPPointF.recycleInstance(p1out);
    MPPointF.recycleInstance(p2out);
}
Also used : MPPointF(com.github.mikephil.charting.utils.MPPointF) Paint(android.graphics.Paint)

Example 33 with MPPointF

use of com.github.mikephil.charting.utils.MPPointF in project MPAndroidChart by PhilJay.

the class RadarChartRenderer method drawDataSet.

/**
     * Draws the RadarDataSet
     *
     * @param c
     * @param dataSet
     * @param mostEntries the entry count of the dataset with the most entries
     */
protected void drawDataSet(Canvas c, IRadarDataSet dataSet, int mostEntries) {
    float phaseX = mAnimator.getPhaseX();
    float phaseY = mAnimator.getPhaseY();
    float sliceangle = mChart.getSliceAngle();
    // calculate the factor that is needed for transforming the value to
    // pixels
    float factor = mChart.getFactor();
    MPPointF center = mChart.getCenterOffsets();
    MPPointF pOut = MPPointF.getInstance(0, 0);
    Path surface = mDrawDataSetSurfacePathBuffer;
    surface.reset();
    boolean hasMovedToPoint = false;
    for (int j = 0; j < dataSet.getEntryCount(); j++) {
        mRenderPaint.setColor(dataSet.getColor(j));
        RadarEntry e = dataSet.getEntryForIndex(j);
        Utils.getPosition(center, (e.getY() - mChart.getYChartMin()) * factor * phaseY, sliceangle * j * phaseX + mChart.getRotationAngle(), pOut);
        if (Float.isNaN(pOut.x))
            continue;
        if (!hasMovedToPoint) {
            surface.moveTo(pOut.x, pOut.y);
            hasMovedToPoint = true;
        } else
            surface.lineTo(pOut.x, pOut.y);
    }
    if (dataSet.getEntryCount() > mostEntries) {
        // if this is not the largest set, draw a line to the center before closing
        surface.lineTo(center.x, center.y);
    }
    surface.close();
    if (dataSet.isDrawFilledEnabled()) {
        final Drawable drawable = dataSet.getFillDrawable();
        if (drawable != null) {
            drawFilledPath(c, surface, drawable);
        } else {
            drawFilledPath(c, surface, dataSet.getFillColor(), dataSet.getFillAlpha());
        }
    }
    mRenderPaint.setStrokeWidth(dataSet.getLineWidth());
    mRenderPaint.setStyle(Paint.Style.STROKE);
    // draw the line (only if filled is disabled or alpha is below 255)
    if (!dataSet.isDrawFilledEnabled() || dataSet.getFillAlpha() < 255)
        c.drawPath(surface, mRenderPaint);
    MPPointF.recycleInstance(center);
    MPPointF.recycleInstance(pOut);
}
Also used : Path(android.graphics.Path) RadarEntry(com.github.mikephil.charting.data.RadarEntry) MPPointF(com.github.mikephil.charting.utils.MPPointF) Drawable(android.graphics.drawable.Drawable) Paint(android.graphics.Paint)

Example 34 with MPPointF

use of com.github.mikephil.charting.utils.MPPointF in project MPAndroidChart by PhilJay.

the class RadarChartRenderer method drawValues.

@Override
public void drawValues(Canvas c) {
    float phaseX = mAnimator.getPhaseX();
    float phaseY = mAnimator.getPhaseY();
    float sliceangle = mChart.getSliceAngle();
    // calculate the factor that is needed for transforming the value to
    // pixels
    float factor = mChart.getFactor();
    MPPointF center = mChart.getCenterOffsets();
    MPPointF pOut = MPPointF.getInstance(0, 0);
    MPPointF pIcon = MPPointF.getInstance(0, 0);
    float yoffset = Utils.convertDpToPixel(5f);
    for (int i = 0; i < mChart.getData().getDataSetCount(); i++) {
        IRadarDataSet dataSet = mChart.getData().getDataSetByIndex(i);
        if (!shouldDrawValues(dataSet))
            continue;
        // apply the text-styling defined by the DataSet
        applyValueTextStyle(dataSet);
        MPPointF iconsOffset = MPPointF.getInstance(dataSet.getIconsOffset());
        iconsOffset.x = Utils.convertDpToPixel(iconsOffset.x);
        iconsOffset.y = Utils.convertDpToPixel(iconsOffset.y);
        for (int j = 0; j < dataSet.getEntryCount(); j++) {
            RadarEntry entry = dataSet.getEntryForIndex(j);
            Utils.getPosition(center, (entry.getY() - mChart.getYChartMin()) * factor * phaseY, sliceangle * j * phaseX + mChart.getRotationAngle(), pOut);
            if (dataSet.isDrawValuesEnabled()) {
                drawValue(c, dataSet.getValueFormatter(), entry.getY(), entry, i, pOut.x, pOut.y - yoffset, dataSet.getValueTextColor(j));
            }
            if (entry.getIcon() != null && dataSet.isDrawIconsEnabled()) {
                Drawable icon = entry.getIcon();
                Utils.getPosition(center, (entry.getY()) * factor * phaseY + iconsOffset.y, sliceangle * j * phaseX + mChart.getRotationAngle(), pIcon);
                //noinspection SuspiciousNameCombination
                pIcon.y += iconsOffset.x;
                Utils.drawImage(c, icon, (int) pIcon.x, (int) pIcon.y, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
            }
        }
        MPPointF.recycleInstance(iconsOffset);
    }
    MPPointF.recycleInstance(center);
    MPPointF.recycleInstance(pOut);
    MPPointF.recycleInstance(pIcon);
}
Also used : RadarEntry(com.github.mikephil.charting.data.RadarEntry) IRadarDataSet(com.github.mikephil.charting.interfaces.datasets.IRadarDataSet) MPPointF(com.github.mikephil.charting.utils.MPPointF) Drawable(android.graphics.drawable.Drawable) Paint(android.graphics.Paint)

Example 35 with MPPointF

use of com.github.mikephil.charting.utils.MPPointF in project MPAndroidChart by PhilJay.

the class XAxisRenderer method renderAxisLabels.

@Override
public void renderAxisLabels(Canvas c) {
    if (!mXAxis.isEnabled() || !mXAxis.isDrawLabelsEnabled())
        return;
    float yoffset = mXAxis.getYOffset();
    mAxisLabelPaint.setTypeface(mXAxis.getTypeface());
    mAxisLabelPaint.setTextSize(mXAxis.getTextSize());
    mAxisLabelPaint.setColor(mXAxis.getTextColor());
    MPPointF pointF = MPPointF.getInstance(0, 0);
    if (mXAxis.getPosition() == XAxisPosition.TOP) {
        pointF.x = 0.5f;
        pointF.y = 1.0f;
        drawLabels(c, mViewPortHandler.contentTop() - yoffset, pointF);
    } else if (mXAxis.getPosition() == XAxisPosition.TOP_INSIDE) {
        pointF.x = 0.5f;
        pointF.y = 1.0f;
        drawLabels(c, mViewPortHandler.contentTop() + yoffset + mXAxis.mLabelRotatedHeight, pointF);
    } else if (mXAxis.getPosition() == XAxisPosition.BOTTOM) {
        pointF.x = 0.5f;
        pointF.y = 0.0f;
        drawLabels(c, mViewPortHandler.contentBottom() + yoffset, pointF);
    } else if (mXAxis.getPosition() == XAxisPosition.BOTTOM_INSIDE) {
        pointF.x = 0.5f;
        pointF.y = 0.0f;
        drawLabels(c, mViewPortHandler.contentBottom() - yoffset - mXAxis.mLabelRotatedHeight, pointF);
    } else {
        // BOTH SIDED
        pointF.x = 0.5f;
        pointF.y = 1.0f;
        drawLabels(c, mViewPortHandler.contentTop() - yoffset, pointF);
        pointF.x = 0.5f;
        pointF.y = 0.0f;
        drawLabels(c, mViewPortHandler.contentBottom() + yoffset, pointF);
    }
    MPPointF.recycleInstance(pointF);
}
Also used : MPPointF(com.github.mikephil.charting.utils.MPPointF)

Aggregations

MPPointF (com.github.mikephil.charting.utils.MPPointF)43 Paint (android.graphics.Paint)13 Drawable (android.graphics.drawable.Drawable)9 RectF (android.graphics.RectF)5 TextPaint (android.text.TextPaint)5 Entry (com.github.mikephil.charting.data.Entry)5 PieEntry (com.github.mikephil.charting.data.PieEntry)4 Transformer (com.github.mikephil.charting.utils.Transformer)4 Path (android.graphics.Path)3 RadarEntry (com.github.mikephil.charting.data.RadarEntry)3 IPieDataSet (com.github.mikephil.charting.interfaces.datasets.IPieDataSet)3 SuppressLint (android.annotation.SuppressLint)2 BarBuffer (com.github.mikephil.charting.buffer.BarBuffer)2 Chart (com.github.mikephil.charting.charts.Chart)2 BarEntry (com.github.mikephil.charting.data.BarEntry)2 BubbleData (com.github.mikephil.charting.data.BubbleData)2 BubbleEntry (com.github.mikephil.charting.data.BubbleEntry)2 PieData (com.github.mikephil.charting.data.PieData)2 PieDataSet (com.github.mikephil.charting.data.PieDataSet)2 IValueFormatter (com.github.mikephil.charting.formatter.IValueFormatter)2