protected override void drawChart(CanvasDrawingSession canvas) { if (chartData == null) { return; } int transitionAlpha = 255; //canvas.save(); if (transitionMode == TRANSITION_MODE_CHILD) { transitionAlpha = (int)(transitionParams.progress * transitionParams.progress * 255); canvas.Transform = Matrix3x2.CreateScale( new Vector2(transitionParams.progress, transitionParams.progress), new Vector2(chartArea.centerX(), chartArea.centerY()) ); } if (isEmpty) { if (emptyDataAlpha != 0) { emptyDataAlpha -= 0.12f; if (emptyDataAlpha < 0) { emptyDataAlpha = 0; } invalidate(); } } else { if (emptyDataAlpha != 1f) { emptyDataAlpha += 0.12f; if (emptyDataAlpha > 1f) { emptyDataAlpha = 1f; } invalidate(); } } transitionAlpha = (int)(transitionAlpha * emptyDataAlpha); float sc = 0.4f + emptyDataAlpha * 0.6f; canvas.Transform = Matrix3x2.CreateScale( new Vector2(sc, sc), new Vector2(chartArea.centerX(), chartArea.centerY()) ); int radius = (int)((chartArea.Width > chartArea.Height ? chartArea.Height : chartArea.Width) * 0.45f); rectF = createRect( chartArea.centerX() - radius, chartArea.centerY() + 16 - radius, chartArea.centerX() + radius, chartArea.centerY() + 16 + radius ); float a = -90f; float rText; int n = lines.Count; float localSum = 0f; for (int i = 0; i < n; i++) { float v = lines[i].drawingPart * lines[i].alpha; localSum += v; } if (localSum == 0) { //canvas.restore(); return; } for (int i = 0; i < n; i++) { if (lines[i].alpha <= 0 && !lines[i].enabled) { continue; } lines[i].paint.A = (byte)transitionAlpha; float currentPercent = lines[i].drawingPart / localSum * lines[i].alpha; darawingValuesPercentage[i] = currentPercent; if (currentPercent == 0) { continue; } //canvas.save(); double textAngle = a + (currentPercent / 2f) * 360f; if (lines[i].selectionA > 0f) { float ai = INTERPOLATOR.getInterpolation(lines[i].selectionA); canvas.Transform = Matrix3x2.CreateTranslation( (float)(Math.Cos(MathEx.ToRadians(textAngle)) * 8 * ai), (float)(Math.Sin(MathEx.ToRadians(textAngle)) * 8 * ai) ); } //lines[i].paint.setStyle(Paint.Style.FILL_AND_STROKE); lines[i].paint.StrokeWidth = 1; //lines[i].paint.setAntiAlias(!USE_LINES); //canvas.drawArc( // rectF, // a, // (currentPercent) * 360f, // true, // lines[i].paint); var b = a + (currentPercent) * 360f; var builder = new CanvasPathBuilder(canvas); var center = new Vector2((float)rectF.X + (float)rectF.Width / 2, (float)rectF.Y + (float)rectF.Height / 2); builder.BeginFigure(center); builder.AddLine( new Vector2( (float)(center.X + Math.Sin(a * Math.PI / 180) * (float)rectF.Width / 2), (float)(center.Y - Math.Cos(a * Math.PI / 180) * (float)rectF.Height / 2))); builder.AddArc( new Vector2( (float)(center.X + Math.Sin(b * Math.PI / 180) * (float)rectF.Width / 2), (float)(center.Y - Math.Cos(b * Math.PI / 180) * (float)rectF.Height / 2)), (float)rectF.Width / 2, (float)rectF.Height / 2, 0, CanvasSweepDirection.Clockwise, (b - a) >= 180.0 ? CanvasArcSize.Large : CanvasArcSize.Small); builder.EndFigure(CanvasFigureLoop.Closed); canvas.FillGeometry(CanvasGeometry.CreatePath(builder), lines[i].paint.Color); //lines[i].paint.setStyle(Paint.Style.STROKE); //canvas.restore(); canvas.Transform = Matrix3x2.Identity; lines[i].paint.A = 255; a += currentPercent * 360f; } a = -90f; for (int i = 0; i < n; i++) { if (lines[i].alpha <= 0 && !lines[i].enabled) { continue; } float currentPercent = (lines[i].drawingPart * lines[i].alpha / localSum); //canvas.save(); double textAngle = a + (currentPercent / 2f) * 360f; if (lines[i].selectionA > 0f) { float ai = INTERPOLATOR.getInterpolation(lines[i].selectionA); canvas.Transform = Matrix3x2.CreateTranslation( (float)(Math.Cos(MathEx.ToRadians(textAngle)) * 8 * ai), (float)(Math.Sin(MathEx.ToRadians(textAngle)) * 8 * ai) ); } int percent = (int)(100f * currentPercent); if (currentPercent >= 0.02f && percent > 0 && percent <= 100) { rText = (float)(rectF.Width * 0.42f * Math.Sqrt(1f - currentPercent)); //textPaint.setTextSize(MIN_TEXT_SIZE + currentPercent * MAX_TEXT_SIZE); //textPaint.setAlpha((int)(transitionAlpha * lines[i].alpha)); //canvas.DrawText( // lookupTable[percent], // (float)(rectF.centerX() + rText * Math.Cos(MathEx.ToRadians(textAngle))), // (float)(rectF.centerY() + rText * Math.Sin(MathEx.ToRadians(textAngle))) - ((textPaint.descent() + textPaint.ascent()) / 2), // textPaint); } //canvas.restore(); canvas.Transform = Matrix3x2.Identity; lines[i].paint.A = 255; a += currentPercent * 360f; } //canvas.restore(); canvas.Transform = Matrix3x2.Identity; }