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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:39:26