如何在SkiaSharp中将Canvas的(0,0)原点设置为画布中心?
在SkiaSharp中把画布原点移至中心的实现方法
核心逻辑:用SkiaSharp的画布变换功能,通过
Translate方法把坐标原点平移到画布中心,之后调用canvas.DrawCircle(0, 0, radius, paint)就能直接在中心画圆。具体代码示例:
在OnPaintSurface方法里先处理画布变换,再执行绘制:protected override void OnPaintSurface(SKPaintSurfaceEventArgs args) { base.OnPaintSurface(args); var canvas = args.Surface.Canvas; var canvasInfo = args.Info; // 清空画布底色 canvas.Clear(SKColors.White); // 将原点平移到画布中心 canvas.Translate(canvasInfo.Width / 2, canvasInfo.Height / 2); // 可选:如果要贴合笛卡尔坐标系Y轴向上的规则,添加Y轴翻转 // canvas.Scale(1, -1); // 绘制中心圆 using var circlePaint = new SKPaint { Color = SKColors.DarkBlue, Style = SKPaintStyle.Fill }; canvas.DrawCircle(0, 0, 50, circlePaint); // 绘制笛卡尔坐标系示例 using var axisPaint = new SKPaint { Color = SKColors.Black, StrokeWidth = 2 }; // X轴 canvas.DrawLine(-canvasInfo.Width/2, 0, canvasInfo.Width/2, 0, axisPaint); // Y轴(未翻转Y轴时向下,翻转后向上) canvas.DrawLine(0, -canvasInfo.Height/2, 0, canvasInfo.Height/2, axisPaint); }注意事项:
Translate操作会直接改变画布的坐标原点,后续所有绘制的坐标都会基于这个新原点计算。- 如果使用
Scale(1, -1)翻转Y轴,要注意绘制的文本、图形会垂直翻转,需要额外调整(比如文本绘制时再做一次翻转)。 - 若需要临时切换坐标原点,可使用
canvas.Save()保存当前画布状态,绘制完成后用canvas.Restore()恢复到初始状态,避免影响后续绘制。
内容的提问来源于stack exchange,提问作者Costas
相关产品推荐
相关产品推荐

