-
Notifications
You must be signed in to change notification settings - Fork 376
SVG support
SVG files are now working and support every FFImageLoading's feature. It uses SkiaSharp for rendering. If SVG file isn't loading, try to optimise file first using this: https://jakearchibald.github.io/svgomg/ (or cmd only https://github.com/svg/svgo and add it to your pre-build scripts)
FFImageLoading now supports loading data as data:
urls or plain SVG.
data:image/svg+xml,[BASE_64_ENCODED_SVG_FILE]
<SVG>[SVG_FILE_CONTENT</SVG>
data:image/svg+xml,<SVG>[SVG_FILE_CONTENT</SVG>
Read more here:
It's very easy, just add Xamarin.FFImageLoading.Svg.Forms
nuget and use SvgCachedImage
instead CachedImage
:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="FFImageLoading.Forms.Sample.SvgSamplePage"
xmlns:ffimageloadingsvg="clr-namespace:FFImageLoading.Svg.Forms;assembly=FFImageLoading.Svg.Forms">
<ContentPage.Content>
<ffimageloadingsvg:SvgCachedImage WidthRequest="200" HeightRequest="200" Source="sample.svg"/>
<!-- SECOND APPROACH (PCL EmbeddedResource): -->
<ffimageloadingsvg:SvgCachedImage WidthRequest="200" HeightRequest="200" Source="resource://FFImageLoading.Forms.Sample.Resources.sample.svg"/>
</ContentPage.Content>
</ContentPage>
When loading from embedded resources, you can specify different assembly with following format: resource://FFImageLoading.Forms.Sample.Resources.sample.svg?assembly=[ASSEMBLY FULL NAME]
More advanced scenarios: use a custom SvgImageSource
which enables SVG support. Please notice, that it has optional parameters for controlling renderered SVG size (automatic by default) IMPORTANT: Your projects also must reference System.Xml.Linq
.
From code:
source = SvgImageSource.FromFile("image.svg")
source = SvgImageSource.FromUri("http://example.com/image.svg")
// etc...
Or use a provided converter (eg. when using XAML):
Source="{Binding SvgFileName, Converter={StaticResource SvgImageSourceConverter}}"
When loading images you have to configure custom data resolver which enables SVG support:
ImageService.Instance
.LoadFile("image.svg")
.LoadingPlaceholder("placeholder.svg")
.WithCustomDataResolver(new SvgDataResolver(200, 0, true))
.WithCustomLoadingPlaceholderDataResolver(new SvgDataResolver(200, 0, true))
.Into(imageView);
You can also load svg image from string:
var svgString = @"<svg><rect width=""30"" height=""30"" style=""fill:blue"" /></svg>";
ImageService.Instance
.LoadStream(ct => Task.FromResult<Stream>(new MemoryStream(Encoding.Default.GetBytes(svgString))))
.LoadingPlaceholder(placeHolderPath)
.WithCustomDataResolver(new SvgDataResolver(64, 0, true))
.WithCustomLoadingPlaceholderDataResolver(new SvgDataResolver(64, 0, true))
.Into(imageView);
Converting svg string into UIImage:
var svgString = @"<svg><rect width=""30"" height=""30"" style=""fill:blue"" /></svg>";
UIImage img = await ImageService.Instance
.LoadStream(ct => Task.FromResult<Stream>(new MemoryStream(Encoding.Default.GetBytes(svgString))))
.WithCustomDataResolver(new SvgDataResolver(64, 0, true))
.AsUIImageAsync();
You can replace svg string by using Dictionary<string, string>
replacement map.
Specify / bind ReplaceStringMap
parameter of SvgCachedImage
object OR provide optional replaceStringMap
parameter in SvgImageSource
methods.
Provide replaceStringMap
parameter in SvgDataResolver
constructor.