Xamarin fImage Loading,从绑定设置HeightRequest/WidthRequest时SVGCacheDiImage模糊
我正在使用FFImageLoading在我的Xamarin.Forms项目中显示svg图标。我的理解是,必须明确设置高度和宽度请求,才能正确呈现SVG。每当我尝试将高度/宽度请求绑定到ViewModel上的值时,我都会得到很多像素(我需要这样做,因为所需的大小取决于数据)。如果我明确设置大小,一切看起来都很好 当高度/宽度请求的绑定更改时,SvgCachedImage是否不重新绘制SVGXamarin fImage Loading,从绑定设置HeightRequest/WidthRequest时SVGCacheDiImage模糊,xamarin,xamarin.forms,xamarin.android,xamarin.ios,ffimageloading,Xamarin,Xamarin.forms,Xamarin.android,Xamarin.ios,Ffimageloading,我正在使用FFImageLoading在我的Xamarin.Forms项目中显示svg图标。我的理解是,必须明确设置高度和宽度请求,才能正确呈现SVG。每当我尝试将高度/宽度请求绑定到ViewModel上的值时,我都会得到很多像素(我需要这样做,因为所需的大小取决于数据)。如果我明确设置大小,一切看起来都很好 当高度/宽度请求的绑定更改时,SvgCachedImage是否不重新绘制SVG 如果没有,我有没有办法在尺寸改变时明确强制它们失效并重新绘制?通过将水平和垂直选项设置为“填充”而不是“居中
如果没有,我有没有办法在尺寸改变时明确强制它们失效并重新绘制?通过将水平和垂直选项设置为“填充”而不是“居中”来解决模糊问题:
<Grid>
<ffimageloadingsvg:SvgCachedImage BackgroundColor="Transparent"
Margin="{Binding HarmonicIconMargin}"
HorizontalOptions="Fill"
VerticalOptions="Fill"
WidthRequest="{Binding HarmonicIconWidth}"
HeightRequest="{Binding HarmonicIconWidth}"
Source="{Binding CurrentTestItem, Converter={StaticResource TestItemToHarmonicIconConverter}}" />
</Grid>
在这一点上,它似乎忽略了高度/宽度请求。我本可以尝试更多(可能是要求太多的空间),但我发现将边距绑定到计算属性可以有效地控制SVG图像的大小,同时不会使其变得模糊。为了解决缩放视图大小时SVG模糊的问题
SvgImageSource.VectorWidth
或SvgImageSource.VectorHeight
IzealLocated上的受保护覆盖无效(双倍宽度,双倍高度)
{
如果(0
根据fImageLoading,SVG图像大小由SvgImageSource.VectorWidth
或SvgImageSource.VectorHeight
确定
double sizeX = VectorWidth;
double sizeY = VectorHeight;
if (UseDipUnits)
{
sizeX = VectorWidth.DpToPixels();
sizeY = VectorHeight.DpToPixels();
}
if (sizeX <= 0 && sizeY <= 0)
{
if (picture.CullRect.Width > 0)
sizeX = picture.CullRect.Width;
else
sizeX = 400;
if (picture.CullRect.Height > 0)
sizeY = picture.CullRect.Height;
else
sizeY = 400;
}
else if (sizeX > 0 && sizeY <= 0)
{
sizeY = (int)(sizeX / picture.CullRect.Width * picture.CullRect.Height);
}
else if (sizeX <= 0 && sizeY > 0)
{
sizeX = (int)(sizeY / picture.CullRect.Height * picture.CullRect.Width);
}
resolvedData.ImageInformation.SetType(ImageInformation.ImageType.SVG);
using (var bitmap = new SKBitmap(new SKImageInfo((int)sizeX, (int)sizeY)))
using (var canvas = new SKCanvas(bitmap))
using (var paint = new SKPaint())
{
canvas.Clear(SKColors.Transparent);
var scaleX = (float)sizeX / picture.CullRect.Width;
var scaleY = (float)sizeY / picture.CullRect.Height;
var matrix = SKMatrix.MakeScale(scaleX, scaleY);
canvas.DrawPicture(picture, ref matrix, paint);
canvas.Flush();
token.ThrowIfCancellationRequested();
return await Decode(picture, bitmap, resolvedData).ConfigureAwait(false);
}
double sizeX=矢量宽度;
双尺寸=矢量高度;
如果(使用单位)
{
sizeX=VectorWidth.DpToPixels();
sizeY=VectorHeight.DpToPixels();
}
if(sizeX 0)
sizeY=picture.CullRect.Height;
其他的
sizeY=400;
}
否则,如果(sizeX>0&&sizeY)您是否尝试将DownSampleToViewSize设置为true?如果没有,您能否告诉我其行为?这会使图像变小,但仍然模糊。我还尝试侦听viewmodel上属性的更改,然后调用ReloadImage()。这没有任何作用。看起来有一种方法可以使其无效并重新绘制。告诉我SVG图像的宽度和高度以及要将其绑定到的值,如果这些值没有相同的纵横比,可能会使图像像素化,您需要保持相同的比例a……是的,我正在将高度和宽度绑定到相同的基础值,因此图标是方形的。请记住,我已经通过硬编码值进行了测试。例如,宽度和高度为80和80或100和100。硬编码时,图像看起来是正确的。当我绑定到VM时,图标非常生动。这些硬编码值在ViewModel生成的值范围内。是否继续通过url或本地文件加载SVG图像?如果可以得到相同的结果,可以尝试通过本地文件加载SVG图像。