SkiaSharp大字号文本X坐标偏移问题求助
SkiaSharp大字号文本水平居中偏移修复方案
问题原因
你碰到的偏移是因为手动计算居中时,没考虑SkiaSharp的文本绘制规则:DrawText默认以文本基线的左侧起点作为绘制原点,而MeasureText返回的SKRect包含了字形的完整边界(部分字体的字形会向左超出基线起点,大字号下这个偏移会被放大),直接用rect.Width/2计算X坐标会导致偏差。
最优解决方法:用内置文本对齐
直接给SKPaint设置TextAlign = SKTextAlign.Center,让Skia自动处理居中,不用手动算坐标,这是最靠谱的方式,适配所有字号和字体:
using SKPaint large = new() { Color = SKColors.Black, IsAntialias = true, TextSize = largeFontSize, // 250 Typeface = SKTypeface.FromFamilyName("Roboto"), TextAlign = SKTextAlign.Center // 核心设置 }; // 绘制时X传画布中心即可 float canvasCenterX = canvasSize / 2; canvas.DrawText(Model.TicketNumber, canvasCenterX, Y, large);
手动计算的修正方案(若需自定义逻辑)
如果必须手动计算,要基于文本边界框的实际左右偏移调整X坐标,抵消字形的延伸偏差:
SKRect textBounds = new(); large.MeasureText(Model.TicketNumber, ref textBounds); // 计算文本中心相对于绘制原点的偏移,再调整到画布中心 float textCenterOffset = (textBounds.Left + textBounds.Right) / 2; float X = canvasSize / 2 - textCenterOffset; canvas.DrawText(Model.TicketNumber, X, Y, large);
说明
- 内置对齐方案由Skia的字体渲染引擎处理所有字体细节,彻底避免手动计算的误差,尤其适合大字号场景。
- 手动修正方案通过计算文本边界框的实际中心位置,抵消字形左右延伸带来的偏移,确保文本精准居中。
内容的提问来源于stack exchange,提问作者Shaggydog
相关产品推荐
相关产品推荐

