Xamarin.Forms - SkiaSharp 在后台线程中绘图

Posted

技术标签:

【中文标题】Xamarin.Forms - SkiaSharp 在后台线程中绘图【英文标题】:Xamarin.Forms - SkiaSharp drawing in backgroud thread 【发布时间】:2019-07-09 10:23:57 【问题描述】:

我正在开发一个 Xamarin Forms 应用程序。我想使用 SkiaSharp 库来绘制一系列线和点。可以在后台线程上绘制吗?

从Microsft docs,必须从UI线程调用SKCanvasView.InvalidateSurface()方法。

【问题讨论】:

我的理解告诉我,在 UI 上进行更改的代码将始终在 MainThread 上,其余的始终可以在后台线程上并且不会引起任何问题 我正在“翻译”旧的 android 应用程序。我需要从后台线程从 USB 设备获取一些数据,并且我需要并行绘制。所以我所有的代码都必须在后台线程上,否则 UI 会阻塞。这是实时绘图 【参考方案1】:

您可以将代码添加到这样的并行任务中

公共任务 MyBeautifulPicture()

Task.run((n)=>

SKCanvas.DrawRect(etc,etc); ).ConfigureAwait(true);

【讨论】:

你试过这个代码吗?我试图将我的代码用于绘制一些线 SKCanvas.DrawLine() 并引发异常。【参考方案2】:

我知道这是一个旧线程,但无论如何。

您可以从后台线程执行的操作是使画布无效。

XAML:
<skia:SKCanvasView x:Name="canvas" PaintSurface="OnCanvasViewPaintSurfaceAsync" />

CODE:
SKPaintSurfaceEventArgs args;

// Update canvas through background task    
async void _timer_Elapsed(object sender, ElapsedEventArgs e)

    // Invalidating surface due to data change
    canvas?.InvalidateSurface();


async void OnCanvasViewPaintSurfaceAsync(object sender, SKPaintSurfaceEventArgs args1)

    args = args1;
    await drawAsync();


public async Task drawAsync()


     SKImageInfo info = args.Info;
     SKSurface surface = args.Surface;
     SKCanvas canvas = surface.Canvas;

【讨论】:

以上是关于Xamarin.Forms - SkiaSharp 在后台线程中绘图的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms:如何在 Xamarin.Forms 跨平台项目中开发具有蓝牙连接的应用程序?

Xamarin.Forms:Forms.Context 已过时

Xamarin.Forms 手势密码实现

Xamarin.Forms 和 Xamarin Native 有啥区别? [关闭]

如何使用 Xamarin.Forms.Maps(无 Xamarin.Forms.GoogleMaps)在地图中应用样式或更改颜色

Xamarin Forms Prism:prism ResourceDictionary 中已存在具有键“Xamarin.Forms.NavigationPage”的资源