使用 SkiaSharp 在 Xamarin 中加载 SVG 文件
Load SVG file in Xamarin with SkiaSharp
从 1.55.0 版开始,SkiaSharp 支持读取 SVG 文件。
该软件包已于几天前(2016 年 11 月 10 日)发布,但我找不到足够的文档来说明如何使用它。
需要以下软件包:
SkiaSharp 1.55.0
SkiaSharp 视图和图层 1.55.0
SkiaSharp.Svg1.55.0-beta1
第一个问题是在 Xamarin.Android 中加载 SKSvg 的最佳方式是什么?
这里有两种可能的解决方案可以开始使用 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 的文件名,不带扩展名。
要完成已接受的答案,这里是如何从 URL.
加载 SKSvg
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);
}
}
}
从 1.55.0 版开始,SkiaSharp 支持读取 SVG 文件。 该软件包已于几天前(2016 年 11 月 10 日)发布,但我找不到足够的文档来说明如何使用它。
需要以下软件包: SkiaSharp 1.55.0 SkiaSharp 视图和图层 1.55.0 SkiaSharp.Svg1.55.0-beta1
第一个问题是在 Xamarin.Android 中加载 SKSvg 的最佳方式是什么?
这里有两种可能的解决方案可以开始使用 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 的文件名,不带扩展名。
要完成已接受的答案,这里是如何从 URL.
加载SKSvg
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);
}
}
}