Следующие пакеты должны быть установлены SkiaSharp.Views.Forms
, SkiaSharp.Extended
и SkiaSharp.Svg
. Оттуда я создал пользовательский элемент управления Xamarin.Forms следующим образом:
public class SvgImage : SKCanvasView
{
public static readonly BindableProperty SourceProperty = BindableProperty.Create(nameof(Source), typeof(string), typeof(SvgImage), default(string), propertyChanged: OnPropertyChanged);
public string Source
{
get => (string)GetValue(SourceProperty);
set => SetValue(SourceProperty, value);
}
public static readonly BindableProperty AssemblyNameProperty = BindableProperty.Create(nameof(AssemblyName), typeof(string), typeof(SvgImage), default(string), propertyChanged: OnPropertyChanged);
public string AssemblyName
{
get => (string)GetValue(AssemblyNameProperty);
set => SetValue(AssemblyNameProperty, value);
}
static void OnPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var skCanvasView = bindable as SKCanvasView;
skCanvasView?.InvalidateSurface();
}
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
InvalidateSurface();
}
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
InvalidateSurface();
}
protected override void OnPaintSurface(SKPaintSurfaceEventArgs e)
{
base.OnPaintSurface(e);
try
{
var surface = e.Surface;
var canvas = surface.Canvas;
canvas.Clear();
if (string.IsNullOrEmpty(Source) || string.IsNullOrEmpty(AssemblyName))
return;
var currentAssembly = Assembly.Load(AssemblyName);
using (var stream = currentAssembly.GetManifestResourceStream(AssemblyName + "." + Source))
{
var skSvg = new SKSvg();
skSvg.Load(stream);
var skImageInfo = e.Info;
canvas.Translate(skImageInfo.Width / 2f, skImageInfo.Height / 2f);
var skRect = skSvg.ViewBox;
float xRatio = skImageInfo.Width / skRect.Width;
float yRatio = skImageInfo.Height / skRect.Height;
float ratio = Math.Min(xRatio, yRatio);
canvas.Scale(ratio);
canvas.Translate(-skRect.MidX, -skRect.MidY);
canvas.DrawPicture(skSvg.Picture);
}
}
catch (Exception exc)
{
Console.WriteLine("OnPaintSurface Exception: " + exc);
}
}
}
Мне нужно было указать сборку и путь к папке с изображением Svg, чтобы найти изображение и установить любые изображения Svg. до EmbeddedResource
. Затем для использования элемента управления в Xaml:
<controls:SvgImage AssemblyName="SkiaSharpSvgImage" Source="Resources.tux1.svg" />
Весь созданный мной тестовый проект с открытым исходным кодом можно просмотреть на Github . Кроме того, этот репо, вероятно, можно улучшить, но это был мой первый пробный запуск с использованием изображений SkiaSharp Svg и тестированием всего.