You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Android屏幕分辨率的Skiasharp Canvas显示适配问题

解决Xamarin SkiaSharp绘制SVG在不同DPI屏幕下的居中问题

核心问题在于直接使用屏幕分辨率计算位置时,没有考虑Android的DPI缩放机制,导致不同分辨率设备上的坐标计算偏差。以下是具体解决方案:

  • 使用SkiaSharp提供的画布尺寸而非原始屏幕分辨率
    不要用系统的DisplayMetrics获取宽高,直接用SKPaintSurfaceEventArgs里的args.Info.Width/Height,这是画布的实际物理像素尺寸,已经自动适配了设备DPI。

  • 按比例缩放并计算居中偏移
    保持SVG的宽高比,先算出适配画布的最大缩放比例,再计算水平和垂直方向的偏移量,确保SVG始终居中:

    private void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
    {
        SKCanvas canvas = args.Surface.Canvas;
        canvas.Clear();
    
        // 加载SVG(替换为你的SVG加载逻辑)
        var svg = new SKSvg();
        svg.Load(Resource.Raw.your_svg_file);
    
        if (svg.Picture == null) return;
    
        // 获取SVG原始尺寸
        float svgWidth = svg.Picture.CullRect.Width;
        float svgHeight = svg.Picture.CullRect.Height;
    
        // 计算等比缩放比例
        float scaleX = args.Info.Width / svgWidth;
        float scaleY = args.Info.Height / svgHeight;
        float scale = Math.Min(scaleX, scaleY);
    
        // 计算居中偏移量
        float offsetX = (args.Info.Width - svgWidth * scale) / 2;
        float offsetY = (args.Info.Height - svgHeight * scale) / 2;
    
        // 应用变换并绘制
        canvas.Translate(offsetX, offsetY);
        canvas.Scale(scale);
        canvas.DrawPicture(svg.Picture);
    }
    
  • 确保CanvasView布局正确
    把CanvasView的LayoutOptions设置为FillAndExpand,让画布填充整个可用区域,避免布局限制导致尺寸计算错误。

内容的提问来源于stack exchange,提问作者SRI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:50:45