如何使用Skia4Delphi的TSKPaintBox实现45°文本旋转?
在Skia4Delphi的TSKPaintBox中实现45°文本旋转
要在TSKPaintBox中实现文本旋转,核心是利用Skia画布的变换操作(平移+旋转),配合状态保存/恢复来避免影响其他绘制内容。以下是具体实现步骤和代码示例:
核心思路
- 保存当前画布状态,防止后续操作破坏原有绘制环境
- 将画布原点平移到旋转中心(可以是画布中心或文本自身中心)
- 执行45°旋转(Skia使用弧度,需将角度转换为弧度)
- 绘制文本
- 恢复画布初始状态
代码示例(画布中心旋转)
在TSKPaintBox的OnPaint事件中编写如下代码:
procedure TForm1.SKPaintBox1Paint(Sender: TObject; const Canvas: ISKCanvas; const ARect: TRectF); var LText: string; LCenterPoint: TPointF; begin LText := '45°旋转示例文本'; // 保存画布当前状态 Canvas.Save(); try // 计算画布中心作为旋转原点 LCenterPoint := PointF(ARect.Width / 2, ARect.Height / 2); // 将画布原点平移到旋转中心 Canvas.Translate(LCenterPoint.X, LCenterPoint.Y); // 旋转45°(Radians函数将角度转为Skia所需的弧度) Canvas.Rotate(Radians(45)); // 以旋转中心为原点,居中绘制文本 Canvas.DrawText(LText, PointF(0, 0), TSKTextAlign.Center); finally // 恢复画布初始状态 Canvas.Restore(); end; end;
文本自身中心旋转(可选)
如果需要让文本围绕自身中心旋转(而非画布中心),可以先计算文本的边界,再调整平移和绘制坐标:
procedure TForm1.SKPaintBox1Paint(Sender: TObject; const Canvas: ISKCanvas; const ARect: TRectF); var LText: string; LTextBounds: TRectF; LTextCenter: TPointF; begin LText := '围绕自身旋转的文本'; // 先计算文本的边界范围 LTextBounds := Canvas.MeasureText(LText, ARect.TopLeft); // 计算文本自身的中心坐标 LTextCenter := PointF(LTextBounds.Left + LTextBounds.Width/2, LTextBounds.Top + LTextBounds.Height/2); Canvas.Save(); try // 平移画布原点到文本中心 Canvas.Translate(LTextCenter.X, LTextCenter.Y); // 旋转45° Canvas.Rotate(Radians(45)); // 绘制文本时,坐标偏移文本自身的半宽高,确保文本中心与旋转原点重合 Canvas.DrawText(LText, PointF(-LTextBounds.Width/2, -LTextBounds.Height/2)); finally Canvas.Restore(); end; end;
关键注意点
- 状态保存/恢复:
Canvas.Save()和Canvas.Restore()必须配对使用,否则会导致后续绘制的坐标系统混乱 - 弧度转换:Skia的旋转方法仅接受弧度参数,使用Delphi内置的
Radians()函数可以方便地将角度转为弧度 - 平移的作用:旋转操作默认围绕画布原点(0,0)进行,通过平移将原点移到目标旋转中心,才能让文本围绕指定点旋转
内容的提问来源于stack exchange,提问作者Roberto Colpani
相关产品推荐
相关产品推荐

