基于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
相关产品推荐
相关产品推荐

