Динамическое рисование линий с помощью SkiaSharp в Xamarin

Я пытаюсь динамически рисовать линии с помощью пакета SkiaSharp.

Я определил элемент управления в своем xaml следующим образом:

<skia:SKCanvasView x:Name="CanvasView" PaintSurface="OnCanvasViewPaintSurface" />

Это мой код за классом:

private SkiaSharp.SKCanvas canvas;
private SkiaSharp.SKSurface surface;

void OnCanvasViewPaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs args)
{
    SkiaSharp.SKImageInfo info = args.Info;
    surface = args.Surface;
    canvas = surface.Canvas;

    canvas.Clear();
    SkiaSharp.SKPaint thinLinePaint = new SkiaSharp.SKPaint
    {
        Style = SkiaSharp.SKPaintStyle.Stroke,
        Color = SkiaSharp.SKColors.Blue,
        StrokeWidth = 6
    };
    canvas.DrawLine(0, 0, 50, 50, thinLinePaint);
}

Приведенная выше часть работает нормально, и при загрузке представления при запуске будет нарисована синяя линия. Но я хочу динамически рисовать новые линии и удалять старые.

public void DrawNewLine()
{
    canvas.Clear();
    SkiaSharp.SKPaint thickLinePaint = new SkiaSharp.SKPaint
    {
        Style = SkiaSharp.SKPaintStyle.Stroke,
        Color = SkiaSharp.SKColors.Red,
        StrokeWidth = 16
    };
    canvas.DrawLine(0, 0, 50, 50, thickLinePaint);
}

Я использую поле холста, которое было объявлено ранее, но оно не работает. Приложение будет аварийно завершать работу во время выполнения при использовании объекта холста.

Что я делаю не так?


person random    schedule 11.05.2018    source источник
comment
вам удалось решить вашу проблему?   -  person Costas Aletrari    schedule 25.07.2018
comment
Да, я отметил правильный ответ! @CostasAletrari   -  person random    schedule 25.07.2018


Ответы (1)


Вам нужно использовать метод SKCanvasView.InvalidateSurface() для внутреннего вызова OnCanvasViewPaintSurface().

person Suyon Won    schedule 12.05.2018
comment
Объекты SKSurface и SkCanvas являются временными и существуют только до тех пор, пока выполняется метод рисования. - person Matthew; 16.05.2018
comment
У меня похожая проблема, я хочу перерисовать холст одним нажатием кнопки. У вас есть пример кода, показывающий, как InvalidateSurface работает с перерисовкой? - person Costas Aletrari; 25.07.2018