Загрузить файл 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);
}
}
}
Другие вопросы по тегам