Загрузить файл SVG в Xamarin с помощью SkiaSharp
Начиная с версии 1.55.0, SkiaSharp поддерживает чтение файлов SVG. Пакет был выпущен несколько дней назад (10 ноября 2016 года), и я не смог найти достаточно документации о том, как его использовать.
Требуются следующие пакеты: SkiaSharp 1.55.0 SkiaSharp Views & Layers 1.55.0 SkiaSharp.Svg 1.55.0-beta1
Первый вопрос: как лучше всего загрузить SKSvg в Xamarin.Android?
1 ответ
Вот два возможных решения для начала работы со SkiaSharp, которые работают для меня:
Загрузка SVG из папки активов (или подпапки):
public SKSvg LoadAnSvgFromAssets(Context ctx, string assetSvgFileLoc)
{
var assets = ctx.Assets;
var svg = new SKSvg();
using (var stream = new StreamReader(assets.Open(assetSvgFileLoc)))
{
svg.Load(stream.BaseStream);
return svg;
}
}
где "assetSvgFileLoc" - это загружаемый файл svgFilename.svg, включая (если это так) путь внутри папки активов (например, "subf1/subf2/mysvg.svg").
Загрузка SVG как RAW-ресурса
public SKSvg LoadAnSvgFromResources(Context ctx, string svgName))
{
var resId = ctx.Resources.GetIdentifier(svgName, "raw", ctx.PackageName);
var svg = new SKSvg();
using (var stream = ctx.Resources.OpenRawResource(resId))
{
svg.Load(stream);
return svg;
}
}
В этом случае файл находится внутри подпапки Resources "raw", а "svgName" - это имя нашего svg без расширения.
Чтобы завершить принятый ответ, вот как загрузить SKSvg
с URL.
SkiaSharp.Extended.Svg.SKSvg svg = new SkiaSharp.Extended.Svg.SKSvg();
using (WebClient client = new WebClient())
{
svg.Load(new MemoryStream(client.DownloadData(new Uri(ResourceUrl))));
}
Я использую этот код, он отлично работает. У меня может быть SVG в папке PCL, ios или Android. Просто не забудьте включить сборку в путь.
var assembly = this.GetType().GetTypeInfo().Assembly;
using (var s = assembly.GetManifestResourceStream("MyAssembly.Core.Hold.svg"))
{
if (s != null)
{
svg = new SKSvg();
svg.Load(s);
using (SKPaint paint = new SKPaint())
{
canvas.DrawPicture(svg.Picture, paint);
}
}
}