public static void Reverse(this SKPath path) { var clone = new SKPath(path); path = new(); path.AddPathReverse(clone); }
void OnPaint(object sender, SKPaintSurfaceEventArgs e) { SKImageInfo info = e.Info; SKSurface surface = e.Surface; SKCanvas canvas = surface.Canvas; canvas.Clear(); using (var primaryPaint = new SKPaint { IsAntialias = true, Style = SKPaintStyle.Stroke, StrokeCap = SKStrokeCap.Round, StrokeWidth = (float)Thickness, }) using (var path = new SKPath()) using (var backgroundPath = new SKPath()) { var margin = (float)Thickness / 2.0f; if (RadialBackgroundColor != Color.Default && RadialBackgroundColor != Color.Transparent) { primaryPaint.Color = RadialBackgroundColor.ToSKColor(); backgroundPath.AddArc(new SKRect(margin, margin, info.Width - margin, info.Height - margin), -90 + (float)StartAngle, (float)SweepAngle); canvas.DrawPath(backgroundPath, primaryPaint); } SKColor[] colors = new SKColor[] { RadialStartColor.ToSKColor(), RadialStartColor.ToSKColor(), RadialMiddleColor.ToSKColor(), RadialMiddleColor.ToSKColor(), RadialEndColor.ToSKColor(), RadialEndColor.ToSKColor(), RadialStartColor.ToSKColor(), }; float[] colorPos = new float[] { 0, // start (1 / 6.0f) * 1, // start (1 / 6.0f) * 2, // mid (1 / 6.0f) * 3, // mid (1 / 6.0f) * 4, // end (1 / 6.0f) * 5.7f, // end 0.95f // start }; primaryPaint.Shader = SKShader.CreateSweepGradient(new SKPoint(info.Rect.MidX, info.Rect.MidY), colors, colorPos, SKShaderTileMode.Repeat, -90 + (float)StartAngle, -90 + (float)StartAngle + (float)SweepAngle); path.AddArc(new SKRect(margin, margin, info.Width - margin, info.Height - margin), -90 + (float)StartAngle, (float)SweepAngle * (float)Progress); canvas.DrawPath(path, primaryPaint); if (HasLabel) { using (var fontPaint = new SKPaint { IsAntialias = true, Color = TextColor.ToSKColor(), TextSize = (float)FontSize, }) using (var fontPath = new SKPath()) { fontPath.AddPathReverse(path); canvas.DrawTextOnPath(string.Format(TextFormat, Progress), fontPath, 0, (float)FontSize / 3.0f, fontPaint); } } } }