package org.mtransit.android.ui.view; import org.mtransit.android.commons.ui.view.MTView; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; public class MTPieChartPercentView extends MTView { private static final String TAG = MTPieChartPercentView.class.getSimpleName(); @Override public String getLogTag() { return TAG; } private static final float DEGREE_90 = 90.0f; private static final float DEGREE_360 = 360.0f; private RectF bounds; private int value1 = -1; private int value2 = -1; private Paint value1Paint; private Paint value1PaintBg; private Paint value2Paint; private Paint value2PaintBg; private float value1StartAngle; private float value1SweepAngle; private float value2StartAngle; private float value2SweepAngle; public MTPieChartPercentView(Context context) { super(context); init(); } public MTPieChartPercentView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MTPieChartPercentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { this.value1Paint = new Paint(); this.value1Paint.setStyle(Paint.Style.FILL); this.value1Paint.setColor(Color.BLACK); this.value1Paint.setAntiAlias(true); this.value1PaintBg = new Paint(); this.value1PaintBg.setStyle(Paint.Style.STROKE); this.value1PaintBg.setColor(Color.BLACK); this.value1PaintBg.setAntiAlias(true); this.value2Paint = new Paint(); this.value2Paint.setColor(Color.WHITE); this.value2Paint.setStyle(Paint.Style.FILL); this.value2Paint.setAntiAlias(true); this.value2PaintBg = new Paint(); this.value2PaintBg.setColor(Color.WHITE); this.value2PaintBg.setStyle(Paint.Style.STROKE); this.value2PaintBg.setAntiAlias(true); } public void setValueColors(int value1Color, int value1ColorBg, int value2Color, int value2ColorBg) { if (this.value1Paint != null) { this.value1Paint.setColor(value1Color); } if (this.value1PaintBg != null) { this.value1PaintBg.setColor(value1ColorBg); } if (this.value2Paint != null) { this.value2Paint.setColor(value2Color); } if (this.value2PaintBg != null) { this.value2PaintBg.setColor(value2ColorBg); } } public void setValues(int value1, int value2) { if (this.value1 == value1 && this.value2 == value2) { return; // no change } this.value1 = value1; this.value2 = value2; resetValuesAngles(); } private void resetValuesAngles() { int total = getTotal(); float value1EndingAngle = DEGREE_90 + (this.value1 * DEGREE_360 / total); float value2EndingAngle = value1EndingAngle + (this.value2 * DEGREE_360 / total); this.value1StartAngle = DEGREE_360 - value1EndingAngle; this.value1SweepAngle = value1EndingAngle - DEGREE_90; this.value2StartAngle = DEGREE_360 - value2EndingAngle; this.value2SweepAngle = value2EndingAngle - value1EndingAngle; invalidate(); } public int getTotal() { if (this.value1 < 0 || this.value2 < 0) { return -1; } return this.value1 + this.value2; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (getTotal() >= 0) { canvas.drawArc(this.bounds, this.value1StartAngle, this.value1SweepAngle, true, this.value1Paint); canvas.drawArc(this.bounds, this.value1StartAngle, this.value1SweepAngle, false, this.value1PaintBg); canvas.drawArc(this.bounds, this.value2StartAngle, this.value2SweepAngle, true, this.value2Paint); canvas.drawArc(this.bounds, this.value2StartAngle, this.value2SweepAngle, false, this.value2PaintBg); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(width, height); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); float innerCircleDiameter = Math.min(w, h); float left = w > innerCircleDiameter ? (w - innerCircleDiameter) / 2 : 0; float top = h > innerCircleDiameter ? (h - innerCircleDiameter) / 2 : 0; float right = left + innerCircleDiameter; float bottom = top + innerCircleDiameter; left += getPaddingLeft(); top += getPaddingTop(); right -= getPaddingRight(); bottom -= getPaddingBottom(); this.bounds = new RectF(left, top, right, bottom); invalidate(); } }