Анимация обратного отсчета с закругленным скипа острым прямоугольником в формах 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);
}
}
}