「MAUIでSkiaSharpを使う」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
67行目: 67行目:
 
描画
 
描画
 
<source lang="csharp">
 
<source lang="csharp">
    void canvasViewPaintSurface(Object sender, SKPaintSurfaceEventArgs e)
+
void canvasViewPaintSurface(Object sender, SKPaintSurfaceEventArgs e)
    {
+
{
if (_bitmap == null)
+
if (_bitmap == null)
return;
+
return;
using var canvas = e.Surface.Canvas;
+
using var canvas = e.Surface.Canvas;
canvas.Clear();
+
canvas.Clear();
canvas.DrawBitmap(_bitmap, x:0, y:0);
+
canvas.DrawBitmap(_bitmap, x:0, y:0);
    }
+
}
 
</source>
 
</source>
  
 
[[category: MAUI]]
 
[[category: MAUI]]

2024年3月4日 (月) 06:54時点における版

MAUISkiaSharpを使う方法は公式サイトにあるが機械翻訳がわかりにくい。

NuGet

以下のNuGetをぶちこむ。

  • SkiaSharp.Views.Maui.Controls

MauiAppBuilder

MainProgram.csに「using SkiaSharp.Views.Maui.Controls.Hosting;」と「.UseSkiaSharp()」を追加する。

using Microsoft.Extensions.Logging;
using SkiaSharp.Views.Maui.Controls.Hosting;

public static class MauiProgram
{
	public static MauiApp CreateMauiApp()
	{
		var builder = MauiApp.CreateBuilder();
		builder
			.UseMauiApp<App>()
			.UseSkiaSharp()
			.ConfigureFonts(fonts =>
			{
				fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
				fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
			});

#if DEBUG
		builder.Logging.AddDebug();
#endif

		return builder.Build();
	}
}

XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:skia="clr-namespace:SkiaSharp.Views.Maui.Controls;assembly=SkiaSharp.Views.Maui.Controls"
             x:Class="Maui8.MainPage">

    <skia:SKCanvasView x:Name="canvasView"
                        PaintSurface="canvasViewPaintSurface"
                        VerticalOptions="Fill"
                        HorizontalOptions="Fill"
                        />

</ContentPage>

CS

更新はメインスレッドでやる。

await MainThread.InvokeOnMainThreadAsync(() =>
{
	if (_bitmap != null)
		_bitmap.Dispose();
	_bitmap = bitmap;
	canvasView.InvalidateSurface();
});

描画

void canvasViewPaintSurface(Object sender, SKPaintSurfaceEventArgs e)
{
	if (_bitmap == null)
		return;
	using var canvas = e.Surface.Canvas;
	canvas.Clear();
	canvas.DrawBitmap(_bitmap, x:0, y:0);
}