Невозможно пройти тесты, в окне с вопросами пусто |
2D-графика и анимация в Silverlight
30.2. Трансформация объектов
Трансформация в Silverlight может применяться к объектам, которые наследуются от UIElement. На практике оказывается, что это – текст, изображения, фигуры, элементы управления, другие элементы. В UIElement есть свойство RenderTransform, которому можно назначать объект типа Transform (System.Windows.Media.Transform). В частности, существуют следующие классы (из пространства имён System.Windows.Media), которые можно использовать при настройке данного свойства:
- CompositeTransform (Составная трансформация) – позволяет задавать несколько операций трансформации в определенной последовательности
- MatrixTransform (Трансформация с использованием матрицы) – позволяет выполнять трансформации с использованием матрицы
- RotateTransform (Трансформация вращением) – позволяет вращать объекты
- ScaleTransform (Трансформация масштабированием) – позволяет управлять размером объекта
- SkewTransform (Трансформация наклонением) – позволяет смещать одни части объекта относительно других (как бы перекашивает объект, превращая, например, прямоугольник в параллелограмм)
- TransformGroup (Группа трансформаций) – позволяет комбинировать несколько трансформаций
- TranslateTransform (Трансформация переносом) – позволяет менять местоположение объекта
Задавать трансформации можно как в XAML-описании объектов, так и в коде, меняя параметры трансформации по какому-либо событию.
Рассмотрим пример описания трансформации в XAML-коде. Создадим новую страницу, назовём её Transformation.XAML, сделаем её доступной с главной страницы по ссылке.
Добавим на страницу новый TextBlock, введем в него текст "Текст для трансформации", зададим размер шрифта (FontSize) 32 пункта. Создадим две копии текстового блока. Добавим на страницу кнопку (элемент управления Button), её копию и приведем их код в вид, представленный в листинге 30.5.
<!-- Исходный текст--> <TextBlock Height="58" HorizontalAlignment="Left" Margin="28,32,0,0" Name="textBlock1" Text="Текст для трансформации" VerticalAlignment="Top" FontSize="32" Width="393" /> <!-- Перекошенный текст --> <TextBlock FontSize="32" Height="58" HorizontalAlignment="Left" Margin="16,98,0,0" Name="textBlock2" Text="Текст для трансформации" VerticalAlignment="Top" Width="393" > <TextBlock.RenderTransform> <SkewTransform AngleX="30" AngleY="10"/> </TextBlock.RenderTransform> </TextBlock> <!-- Наклоненный текст --> <TextBlock FontSize="32" Height="58" HorizontalAlignment="Left" Margin="30,301,0,0" Name="textBlock3" Text="Текст для трансформации" VerticalAlignment="Top" Width="393" > <TextBlock.RenderTransform> <RotateTransform Angle="-15"/> </TextBlock.RenderTransform> </TextBlock> <!--Исходная кнопка --> <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="263,313,0,0" Name="button1" VerticalAlignment="Top" Width="160" /> <!-- Перекошенная и увеличенная кнопка--> <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="149,410,0,0" Name="button2" VerticalAlignment="Top" Width="160"> <Button.RenderTransform> <TransformGroup> <SkewTransform AngleX="-50" AngleY="20"/> <ScaleTransform ScaleX="2"/> </TransformGroup> </Button.RenderTransform> </Button>Листинг 30.5. XAML-код элементов управления с применением трансформаций
Внутри описания элемента мы задаем свойства для RenderTransform. Два трансформированных фрагмента текста демонстрируют трансформации SkewTransform и RotateTransform. К кнопке мы применили сразу две трансформации, для этого нам понадобилось использовать тег TransformGroup (фактически, воспользовались группой трансформаций). Сначала мы применили трансформацию перекоса, потом – масштабирования.
Итог работы вышеприведенного кода вы можете видеть на рис. 30.8.
Обратите внимание на то, что взаимодействие пользователя с трансформированными элементами управления выглядит так же, как с обычными. То есть, например, нажатие на кнопку обрабатывается в соответствии с её новым местоположением.
Рассмотрим теперь анимацию объектов с использованием трансформаций и события Rendering.