Example #1
0
        private void DrawPasteOverlay(Avalonia.Point dominoPoint, PointerEventArgs e)
        {
            // display the dominoes to paste as a half-transparent overlay.
            // reference point:
            var reference_point = Dominoes[toCopy.Min()].CenterPoint - dominoPoint;

            if (PasteOverlays.Count == 0)
            {
                // create the overlays
                foreach (int i in toCopy)
                {
                    var p      = new SkiaSharp.SKPath();
                    var points = Dominoes[i].CanvasPoints;
                    if (points.Length > 1)
                    {
                        p.MoveTo(new SkiaSharp.SKPoint((float)points[0].X - (float)reference_point.X, (float)points[0].Y - (float)reference_point.Y));
                        foreach (var point in points.Skip(1))
                        {
                            p.LineTo(new SkiaSharp.SKPoint((float)point.X - (float)reference_point.X, (float)point.Y - (float)reference_point.Y));
                        }
                    }
                    var color = Dominoes[i].StoneColor.ToSKColor().WithAlpha(128);
                    PasteOverlays.Add(new CanvasDrawable()
                    {
                        BeforeBorders = false, Paint = new SkiaSharp.SKPaint()
                        {
                            Color = color
                        }, Path = p
                    });
                }
                AdditionalDrawables.AddRange(PasteOverlays);
            }
            else
            {
                // find out difference between current and last reference point
                var shift     = lastreference - reference_point;
                var transform = SkiaSharp.SKMatrix.CreateTranslation((float)shift.X, (float)shift.Y);
                System.Diagnostics.Debug.WriteLine(shift);
                foreach (var stone in PasteOverlays)
                {
                    stone.Path.Transform(transform);
                }
            }
            lastreference = reference_point;
            Redraw();
        }
        protected override void OnPaintSurface(SKPaintSurfaceEventArgs e)
        {
            try
            {
                var   w  = e.Info.Width;
                var   h  = e.Info.Height;
                float cx = w / 2.0f;
                float cy = h / 2.0f;

                float Radius = Math.Min(cx, cy);

                Paint.Typeface = Font;

                float currentRate = 0;
                foreach (var item in Members)
                {
                    paint.IsAntialias = true;
                    {
                        var path = new SkiaSharp.SKPath();
                        if (item.Rate % 1 == 0f && item.Rate > 0.5f)
                        {
                            path.AddCircle(cx, cy, Radius * OuterRate);
                        }
                        else
                        {
                            path.ArcTo(new SkiaSharp.SKRect(cx - Radius * OuterRate, cy - Radius * OuterRate, cx + Radius * OuterRate, cy + Radius * OuterRate), 360 * (currentRate - 0.25f), 360 * item.Rate, false);
                            path.LineTo(cx, cy);
                            //path.LineTo(cx + Radius * (float)Math.Sin(Math.PI * 2 * currentRate) * OuterRate, cy - Radius * (float)Math.Cos(Math.PI * 2 * currentRate) * OuterRate);
                            path.Close();
                        }
                        Paint.Color    = item.Color;
                        Paint.IsStroke = false;
                        e.Surface.Canvas.DrawPath(path, Paint);
                    }
                    {
                        var path = new SkiaSharp.SKPath();
                        path.MoveTo(cx + Radius * (float)Math.Sin(Math.PI * 2 * currentRate) * OuterRate, cy - Radius * (float)Math.Cos(Math.PI * 2 * currentRate) * OuterRate);
                        path.LineTo(cx, cy);
                        Paint.Color       = new SkiaSharp.SKColor(255, 255, 255, 0);
                        Paint.StrokeWidth = Radius * 0.02f;
                        Paint.IsStroke    = true;
                        Paint.BlendMode   = SkiaSharp.SKBlendMode.Clear;
                        e.Surface.Canvas.DrawPath(path, Paint);
                        Paint.BlendMode = SkiaSharp.SKBlendMode.SrcOver;
                    }

                    currentRate += item.Rate;
                }
                {
                    Paint.Color     = new SkiaSharp.SKColor(255, 255, 255);
                    Paint.IsStroke  = false;
                    Paint.BlendMode = SkiaSharp.SKBlendMode.Clear;
                    e.Surface.Canvas.DrawCircle(cx, cy, Radius * InnerRate, Paint);
                    Paint.BlendMode = SkiaSharp.SKBlendMode.SrcOver;
                }
                {
                    var path = new SkiaSharp.SKPath();
                    path.MoveTo(cx + Radius * (float)Math.Sin(Math.PI * 2 * currentRate) * OuterRate, cy - Radius * (float)Math.Cos(Math.PI * 2 * currentRate) * OuterRate);
                    path.LineTo(cx, cy);
                    Paint.Color       = new SkiaSharp.SKColor(255, 255, 255, 0);
                    Paint.StrokeWidth = Radius * 0.02f;
                    Paint.IsStroke    = true;
                    Paint.BlendMode   = SkiaSharp.SKBlendMode.Clear;
                    e.Surface.Canvas.DrawPath(path, Paint);
                    Paint.BlendMode = SkiaSharp.SKBlendMode.SrcOver;
                }
                {
                    Paint.TextSize  = TitleFontSize * Radius;
                    Paint.Color     = new SkiaSharp.SKColor(0, 0, 0);
                    Paint.IsStroke  = false;
                    Paint.TextAlign = SkiaSharp.SKTextAlign.Center;
                    e.Surface.Canvas.DrawText(Title, cx, cy + Paint.FontMetrics.AverageCharacterWidth / 2.0f, Paint);
                }
            }
            catch { }
            base.OnPaintSurface(e);
        }