SkiaSharp 转换

Download Sample下载示例

了解用于显示 SkiaSharp 图形的转换

SkiaSharp 支持作为 SKCanvas 对象方法实现的传统图形转换。 从数学角度看,转换会在图形对象呈现时更改在 SKCanvas 绘图函数中指定的坐标和大小。 转换通常便于绘制重复的图像或动画。 如果不使用转换,一些技术(如旋转位图或文本)是不可能实现的。

SkiaSharp 转换支持以下操作:

  • 平移以将坐标从一个位置移动到另一个
  • 缩放以增加或减小坐标和大小
  • 旋转以围绕某个点旋转坐标
  • 倾斜以沿水平或垂直方向移动坐标,从而将矩形变为平行四边形

这些称为仿射转换。 仿射转换始终保持平行线,并且永远不会导致坐标或大小变为无限大小。 正方形永远不会被转换成除平行四边形以外的任何形状,而圆形也不会被转换成除椭圆以外的任何形状。

SkiaSharp 还支持基于标准 3 乘 3 转换矩阵的非仿射转换(也称为投影或透视转换)。 非仿射变换则允许将正方形转换成任何凸四边形,即所有内角小于 180 度的四边形。 非仿射转换可能会导致坐标或大小变为无限大,但它们对于 3D 效果至关重要。

SkiaSharp 与 Xamarin.Forms 转换之间的差异

Xamarin.Forms 也支持与 SkiaSharp 中的转换类似的转换。 该 Xamarin.FormsVisualElement 类定义了以下转换属性:

RotationXRotationY 属性是创建准 3D 效果的透视转换。

SkiaSharp 转换和 Xamarin.Forms 转换之间存在几点关键差异:

第一个区别是,SkiaSharp 转换应用于整个 SKCanvas 对象,而 Xamarin.Forms 转换则应用于单个 VisualElement 派生对象。 (可以将 Xamarin.Forms 转换应用于 SKCanvasView 对象本身,因为 SKCanvasView 派生自 VisualElement,但在此 SKCanvasView 中则适用 SkiaSkarp 转换。)

SkiaSharp 转换相对于 SKCanvas 的左上角,而 Xamarin.Forms 转换则相对于应用它的 VisualElement 的左上角。 应用缩放和旋转转换时,这一差异非常重要,因为这些转换始终相对于特定的点。

真正很大的差异在于 SKiaSharp 转换是方法,而 Xamarin.Forms 转换是属性。 这是超越了语法差异的语义差异:SkiaSharp 转换执行操作,而 Xamarin.Forms 转换则是设置状态。 SkiaSharp 转换适用于随后绘制的图形对象,但不适用于在应用转换之前绘制的图形对象。 相比之下,设置属性后,Xamarin.Forms 转换就会应用于以前呈现的元素。 调用方法时,SkiaSharp 转换是累积的;将属性设置为另一个值时,将会替换 Xamarin.Forms 转换。

本部分中的所有示例程序都显示在 SkiaSharpFormsDemos 程序的“SkiaSharp 转换”部分中。 要查找源代码,请访问解决方案的 Transforms 文件夹。

翻译转换

了解如何使用平移转换来转移 SkiaSharp 图形。

缩放转换

了解用于将对象缩放为各种大小的 SkiaSharp 缩放变换。

旋转转换

使用 SkiaSharp 旋转转换来探索可能的效果和动画。

倾斜转换

查看倾斜转换如何创建倾斜图形对象。

矩阵转换

深入探讨使用多用途转换矩阵的 SkiaSharp 转换。

触摸操作

使用矩阵转换实现可用于拖动、缩放和旋转的触摸操作。

非仿射转换

使用非仿射转换效果超越平凡。

3D 旋转

使用非仿射转换在 3D 空间中旋转 2D 对象。