protected override void OnDraw(Canvas canvas) { canvas.DrawColor(Color.Transparent); paint.Reset(); paint.AntiAlias = true; float midX, midY, radius, innerRadius; path.Reset(); float currentAngle = 270; float currentSweep; float totalValue = 0; float padding = 2; midX = Width / 2; midY = Height/2; if (midX < midY){ radius = midX; } else { radius = midY; } radius -= padding; innerRadius = radius - thickness; foreach (PieSlice slice in slices) { totalValue += slice.getValue(); } int count = 0; foreach (PieSlice slice in slices) { Path p = new Path(); paint.Color = slice.getColor (); currentSweep = (slice.getValue()/totalValue)*(360); p.ArcTo(new RectF(midX-radius, midY-radius, midX+radius, midY+radius), currentAngle+padding, currentSweep - padding); p.ArcTo(new RectF(midX-innerRadius, midY-innerRadius, midX+innerRadius, midY+innerRadius), (currentAngle+padding) + (currentSweep - padding), -(currentSweep-padding)); p.Close (); slice.setPath(p); slice.setRegion(new Region((int)(midX-radius), (int)(midY-radius), (int)(midX+radius), (int)(midY+radius))); canvas.DrawPath(p, paint); if (indexSelected == count && listener != null){ path.Reset(); paint.Color = slice.getColor (); paint.Color = Color.ParseColor ("#33B5E5"); paint.Alpha=100; if (slices.Count > 1) { path.ArcTo(new RectF(midX-radius-(padding*2), midY-radius-(padding*2), midX+radius+(padding*2), midY+radius+(padding*2)), currentAngle, currentSweep+padding); path.ArcTo(new RectF(midX-innerRadius+(padding*2), midY-innerRadius+(padding*2), midX+innerRadius-(padding*2), midY+innerRadius-(padding*2)), currentAngle + currentSweep + padding, -(currentSweep + padding)); path.Close(); } else { path.AddCircle(midX, midY, radius+padding, Android.Graphics.Path.Direction.Cw); } canvas.DrawPath(path, paint); paint.Alpha=255; } currentAngle = currentAngle+currentSweep; count++; } }
public static APath AsAndroidPath(this PathF path) { var nativePath = new APath(); int pointIndex = 0; int arcAngleIndex = 0; int arcClockwiseIndex = 0; foreach (var operation in path.PathOperations) { if (operation == PathOperation.MoveTo) { var point = path[pointIndex++]; nativePath.MoveTo(point.X, point.Y); } else if (operation == PathOperation.Line) { var point = path[pointIndex++]; nativePath.LineTo(point.X, point.Y); } else if (operation == PathOperation.Quad) { var controlPoint = path[pointIndex++]; var point = path[pointIndex++]; nativePath.QuadTo(controlPoint.X, controlPoint.Y, point.X, point.Y); } else if (operation == PathOperation.Cubic) { var controlPoint1 = path[pointIndex++]; var controlPoint2 = path[pointIndex++]; var point = path[pointIndex++]; nativePath.CubicTo(controlPoint1.X, controlPoint1.Y, controlPoint2.X, controlPoint2.Y, point.X, point.Y); } else if (operation == PathOperation.Arc) { var topLeft = path[pointIndex++]; var bottomRight = path[pointIndex++]; var startAngle = path.GetArcAngle(arcAngleIndex++); var endAngle = path.GetArcAngle(arcAngleIndex++); var clockwise = path.IsArcClockwise(arcClockwiseIndex++); while (startAngle < 0) { startAngle += 360; } while (endAngle < 0) { endAngle += 360; } var rect = new RectF(topLeft.X, topLeft.Y, bottomRight.X, bottomRight.Y); var sweep = GraphicsOperations.GetSweep(startAngle, endAngle, clockwise); startAngle *= -1; if (!clockwise) { sweep *= -1; } nativePath.ArcTo(rect, startAngle, sweep); } else if (operation == PathOperation.Close) { nativePath.Close(); } } return(nativePath); }