Анимация обратного отсчета с закругленным скипа острым прямоугольником в формах Xamarin

Я успешно создал что-то вроде обратного отсчета с помощью Skiasharp. Но моя единственная проблема в том, что я не могу получить правильную форму, в которой я хочу, чтобы был обратный отсчет.

Я могу легко сделать обратный отсчет круга, но это кажется более сложным с прямоугольником. Когда я хочу сделать обратный отсчет круга, AddArch кажется, работает очень хорошо. Если я использую это с моим объектом в виде лыжного острия и его размером, он изгибается как круг. Так что мне нужно сделать что-то еще.

Что я вместо этого создал свой путь с этим path.AddRoundRect(new SKRect(1, 1, info.Width - 5, info.Height - 5), 30, 30, SKPathDirection.CounterClockwise); И размер хороший, но проблема в том, что он не создает новый контур, как для AddArch, Таким образом, вместо того, чтобы отрезать старый "угол", другими словами, он просто вращается, не удаляя части границы.

Как бы я решить эту проблему? Может быть, чтобы перевести SKCanvas может быть ответом, но тогда я бы знал, как математически рассчитать перевод от формы дуги до полного прямоугольника с закругленными углами.

У меня есть таймер, нажав на стороне с обновленным progressAngle это продолжает рисовать обновленную форму каждую секунду. StartAngle 360

Это мой код:

    SKImageInfo _info;
    SKSurface _surface;
    SKCanvas _canvas;
    SKPaint _paint;

    protected override void OnPaintSurface(SKPaintSurfaceEventArgs args)
    {
        _info = args.Info;
        _surface = args.Surface;
        _canvas = _surface.Canvas;

        int size = Math.Min(_info.Width, _info.Height);
        int max = Math.Max(_info.Width, _info.Height);

        _canvas.Clear();
        _canvas.Save();

        DrawProgressBorder(_info, _canvas);
    }

 void DrawProgressBorder(SKImageInfo info, SKCanvas canvas)
    {
        int size = Math.Min(info.Width, info.Height);

        var shader = SKShader.CreateSweepGradient(
            new SKPoint(size / 2, size / 2),
            new[]
            {
                ProgressStartColor.ToSKColor(),
                ProgressEndColor.ToSKColor(),
                ProgressStartColor.ToSKColor()
            },
            new[]
            {
                StartAngle / 360,
                (StartAngle + progressAngle + 1) / 360,
                (StartAngle + progressAngle + 2) / 360
        });


        SKPaint paint = new SKPaint
        {
            IsStroke = true,
            StrokeCap = SKStrokeCap.Round,
            Shader = shader,
            Style = SKPaintStyle.Stroke,
            StrokeWidth = 15,
            IsAntialias = true
        };

        DrawBorder(_info, _canvas, paint, progressAngle);
    }


public void DrawBorder(SKImageInfo info, SKCanvas canvas, SKPaint paint, float angle)
    {
        int size = Math.Min(info.Width, info.Height);

        using (SKPath path = new SKPath())
        {
            path.AddRoundRect(new SKRect(1, 1, info.Width - 5, info.Height - 5), 30, 30, SKPathDirection.CounterClockwise);
            //path.AddArc(new SKRect(1, 1, info.Width - 5, info.Height - 5), StartAngle, angle);

            if (path != null && paint != null)
            {
                canvas.DrawPath(path, paint);
            }
        }
    }

0 ответов

Другие вопросы по тегам