Xamarin fImage Loading,从绑定设置HeightRequest/WidthRequest时SVGCacheDiImage模糊

Xamarin 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 如果没有,我有没有办法在尺寸改变时明确强制它们失效并重新绘制?通过将水平和垂直选项设置为“填充”而不是“居中

我正在使用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图像。