Трансформации
29WPF --- Графика и анимация WPF --- Трансформации
Огромный объем задач, связанных с рисованием, может быть упрощен благодаря применению трансформации (transform) — объекта, изменяющего способ рисования фигуры или элемента посредством скрытого сдвига используемой им координатной системы. В WPF трансформации представлены классами, унаследованными от абстрактного класса System.Windows.Media.Transform, которые перечислены в таблице:
Имя | Описание | Важные свойства |
---|---|---|
TranslateTransform | Смещает координатную систему на определенную величину. Эта трансформация удобна, когда нужно нарисовать ту же самую фигуру в разных местах | X,Y |
RotateTransform | Поворачивает координатную систему. Нормально нарисованные фигуры поворачиваются вокруг заданной точки | Angle, CenterX, CenterY |
ScaleTransform | Масштабирует координатную систему в большую и меньшую сторону, так что фигуры становятся больше или меньше. По измерениям X и Y можно применять разную степень масштабирования, в результате растягивая или сжимая фигуру | ScaleX, ScaleY, CenterX, CenterY |
SkewTransform | Деформирует координатную систему, наклоняя ее на определенное число градусов. Например, нарисованный квадрат после трансформации превращается в параллелограмм | AngleX, AngleY, CenterX, CenterY |
MatrixTransform | Модифицирует координатную систему, используя матричное умножение с указанной матрицей. Это наиболее сложная трансформация — она требует определенной математической подготовки | Matrix |
TransformGroup | Комбинирует несколько трансформаций таким образом, что они могут применяться одновременно. Порядок применения трансформаций важен — он влияет на конечный результат. Например, вращение фигуры (с помощью RotateTransform) с последующим перемещением ее (посредством TranslateTransform) переместит фигуру в другое место, отличное от того, которое было бы в случае сначала перемещения фигуры, а потом ее поворота | - |
Формально все трансформации используют математические операции над матрицами для изменения координат фигуры. Однако применение предварительно построенных трансформаций — таких как TranslateTransform, RotateTransform, ScaleTransform и SkewTransform — проще, нежели использование MatrixTransform и попытки найти правильную матрицу для выполнения требуемой операции. В случае выполнения серии трансформаций с помощью TransformGroup среда WPF объединяет их вместе в единую трансформацию MatrixTransform, обеспечивая оптимальную производительность.
Все трансформации наследуются от Freezable (через класс Transform). Это значит, что они имеют автоматическую поддержку уведомлений об изменениях. В случае изменения трансформации, используемой фигурой, фигура немедленно перерисовывает себя.
Трансформации — одна из тех причудливых концепций, которые оказываются чрезвычайно полезными в широком разнообразии различных контекстов. Ниже приведено несколько примеров:
- Наклон фигуры
До сих пор вы были привязаны к горизонтально выровненным прямоугольникам, эллипсам, линиям и многоугольникам. Используя RotateTransform, можно повернуть координатную систему для более удобного создания определенных фигур.
- Повторение фигуры
Многие рисунки строятся на использовании похожих фигур в нескольких разных местах. Применяя трансформацию, можно взять фигуру и переместить ее, повернуть, изменить ее размер и т.д.
Для того чтобы использовать одну и ту же фигуру во многих местах, нужно дублировать ее в коде разметки (что далеко не идеально), использовать код (чтобы создавать фигуры программно) или применять фигуру Path. Фигура Path принимает объекты Geometry, а такой объект геометрии можно хранить в виде ресурса, так что его можно многократно использовать в коде разметки.
- Анимация
С помощью динамических трансформаций, таких как поворот фигуры, перемещение ее из одного места в другое и искажение, можно создавать множество сложных эффектов.