Анимация в XAML-графике
Анимация в Microsoft Expression Blend
Пакет Microsoft Expression Blend содержит визуальные средства для работы с анимацией. Сначала создадим уже знакомый нам прямоугольник, который и будем анимировать:
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="100" Background="White" x:Name="Page"> <Rectangle Canvas.Left ="5" Canvas.Top="5" Width="190" Height="90" Stroke="green" StrokeThickness="2" Fill="Transparent" /> <Rectangle Canvas.Top="40" Width="20" Height="20" Fill="red" x:Name="myRectangle" > </Rectangle> </Canvas>
Лучше всего в главном меню выбрать пункт "Windows \ Active Workspace \ Animation Workspace" – вид редактора изменится, отображая нужные панели инструментов (рис. 7.2):
Создаем раскадровку, для чего на панели "Interaction" выбираем значение списка "New" (рис. 7.3):
В появившемся диалоговом окне "Create Storyboard" оставим предлагаемое название без изменений и снимаем галочку "Create as a Resource" (рис. 7.4):
Если бы мы оставили галочку "Create as a Resource", то запускать анимацию пришлось бы с помощью кода JavaScript. В следующей лекции мы рассмотрим, как это делать, а пока будем двигаться дальше. После создания раскадровки нужно определить стартовое положение анимации. Нажимаем на кнопку "Record Keyframe" (рис. 7.5):
Можно сказать, что текущее расположение объектов (прямоугольника) автоматически будет стартовой позицией. Переносим головку воспроизведения на метку с цифрой 3 (рис. 7.6):
В результате этого действия мы определили конечную позицию анимации. Теперь непосредственно "хватаем" красный прямоугольник и перемещаем его. При этом на временной шкале автоматически появляется серая полоса (рис. 7.7.):
Все, анимация готова. Ее можно увидеть при запуске проекта. Впрочем, воспроизвести движение объекта можно прямо в режиме разработки – для этого следует нажать на кнопку "Play" (рис. 7.8):
Посмотрим код, который сгенерировал пакет Microsoft Expression Blend:
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="100" Background="White" x:Name="Page"> <Canvas.Triggers> <EventTrigger RoutedEvent="Canvas.Loaded"> <BeginStoryboard> <Storyboard x:Name="Storyboard1"> <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="myRectangle" Storyboard.TargetProperty="(UIElement.RenderTransform). (TransformGroup.Children)[3].(TranslateTransform.X)"> <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> <SplineDoubleKeyFrame KeyTime="00:00:03" Value="180"/> </DoubleAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> <Rectangle Canvas.Left ="5" Canvas.Top="5" Width="190" Height="90" Stroke="green" StrokeThickness="2" Fill="Transparent" /> <Rectangle Canvas.Top="40" Width="20" Height="20" Fill="red" x:Name="myRectangle" RenderTransformOrigin="0.5,0.5" > <Rectangle.RenderTransform> <TransformGroup> <ScaleTransform ScaleX="1" ScaleY="1"/> <SkewTransform AngleX="0" AngleY="0"/> <RotateTransform Angle="0"/> <TranslateTransform X="0" Y="0"/> </TransformGroup> </Rectangle.RenderTransform> </Rectangle> </Canvas>
Отметим несколько особенностей:
- Анимация определена не внутри элемента Rectangle, а в описании Canvas.
- В качестве анимируемого свойства используется не координата прямоугольника, а значения трансформации TranslateTransform.
- Сгенерированный код содержит явно лишние фрагменты шаблона, например, группу трансформаций, содержащих значения по умолчанию.
Анимация трансформаций
Рассматривая код предыдущего примера уже можно понять, как осуществляется анимация трансформаций. В принципе, ничего нового здесь нет – мы даем названия с помощью атрибута "x:Name", а затем указываем граничные значения заданного свойства. В табл. 7.9 приводятся подобные примеры.
№ | Код | Вид в браузере |
---|---|---|
7.9.1 | ||
<Canvas xmlns="http://schemas.microsoft.com/ client/2007" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" Width="200" Height="150" Background="White" x:Name="Page"> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="skyblue" Stroke="red" StrokeThickness="2" RenderTransformOrigin="0.5,0.5"> <Rectangle.RenderTransform> <TranslateTransform x:Name="my Transform" X="10" Y="10"/> </Rectangle.RenderTransform> <Rectangle.Triggers> <EventTrigger RoutedEvent=" Rectangle.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation RepeatBehavior= "Forever" Storyboard.TargetName="myTransform" Storyboard.TargetProperty="X" From="10" To="180" Duration="0:0:05" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Rectangle.Triggers> </Rectangle> </Canvas> |
||
Описание | ||
Перемещение прямоугольника в горизонтальном направлении | ||
№ | Код | Вид в браузере |
7.9.2 | ||
<Canvas xmlns="http://schemas.microsoft.com/ client/2007" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" Width="200" Height="150" Background="White" x:Name="Page"> <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50" Height="25" Fill="skyblue" Stroke="red" StrokeThickness="2" RenderTransformOrigin="0.5,0.5"> <Rectangle.RenderTransform> <TranslateTransform x:Name="my Transform" X="10" Y="10"/> </Rectangle.RenderTransform> <Rectangle.Triggers> <EventTrigger RoutedEvent=" Rectangle.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation RepeatBehavior= "Forever" Storyboard.TargetName="myTransform" Storyboard.TargetProperty="X" From="10" To="180" Duration="0:0:05" AutoReverse="True" /> </Storyboard> </BeginStoryboard> <BeginStoryboard> <Storyboard> <DoubleAnimation RepeatBehavior=" Forever" Storyboard.TargetName="myTransform" Storyboard.TargetProperty="Y" From="10" To="130" Duration="0:0:05" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Rectangle.Triggers> </Rectangle> </Canvas> |
||
Описание | ||
Одновременный перенос по оси X и Y будет формировать движение прямоугольника по диагонали | ||
№ | Код | Вид в браузере |
7.9.4 | ||
<Canvas xmlns="http://schemas.microsoft.com/ client/2007" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" Width="200" Height="150" Background="White" x:Name="Page"> <Rectangle Canvas.Left="25" Canvas.Top="25" Width="50" Height="25" Fill="skyblue" Stroke="red" StrokeThickness="2"/> <Rectangle Canvas.Left="25" Canvas.Top="50" Width="50" Height="25" Fill="palegreen" Stroke="red" StrokeThickness="2" > <Rectangle.RenderTransform> <ScaleTransform x:Name="myTransform" ScaleX="1" ScaleY="1" /> </Rectangle.RenderTransform> <Rectangle.Triggers> <EventTrigger RoutedEvent= "Rectangle.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation RepeatBehavior= "Forever" Storyboard.TargetName="myTransform" Storyboard.TargetProperty="ScaleX" From="1" To="2" Duration="0:0:05" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Rectangle.Triggers> </Rectangle> </Canvas> |
||
Описание | ||
Горизонтальное масштабирование | ||
№ | Код | Вид в браузере |
7.9.4 | ||
<Canvas xmlns="http://schemas.microsoft.com/ client/2007" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" Width="400" Height="400" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Повернутая фигура--> <Canvas Width="210" Height="210" Canvas.Left="0" Canvas.Top="0"> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <RotateTransform x:Name="my Transform" Angle="45"/> </Canvas.RenderTransform> <Canvas.Triggers> <EventTrigger RoutedEvent= "Rectangle.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation Repeat Behavior="Forever" Storyboard.TargetName= "myTransform" Storyboard.TargetProperty= "Angle" From="0" To="360" Duration="0:0:10" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> </Canvas> </Canvas> |
||
Описание | ||
Вращение фигуры относительно верхней левой точки элемента Canvas | ||
№ | Код | Вид в браузере |
7.9.4 | ||
<Canvas xmlns="http://schemas.microsoft.com/ client/2007" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" Width="400" Height="400" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Повернутая фигура--> <Canvas Width="200" Height="200" Canvas.Left="0" Canvas.Top="0" RenderTransformOrigin="1,1"> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <RotateTransform x:Name="my Transform" Angle="45"/> </Canvas.RenderTransform> <Canvas.Triggers> <EventTrigger RoutedEvent=" Rectangle.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation RepeatBehavior= "Forever" Storyboard.TargetName="my Transform" Storyboard.TargetProperty= "Angle" From="0" To="360" Duration="0:0:10" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> </Canvas> </Canvas> |
||
Описание | ||
Вращение фигуры относительно верхней левой точки. Выравнивание точки вращения было достигнуто с помощью атрибута RenderTransformOrigin="1,1" | ||
№ | Код | Вид в браузере |
7.9.7 | ||
<Canvas xmlns="http://schemas.microsoft.com/ client/2007" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" Width="400" Height="400" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Повернутая фигура--> <Canvas Width="200" Height="200" Canvas.Left="0" Canvas.Top="0" RenderTransformOrigin="1,1"> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <SkewTransform x:Name=" myTransform" AngleY="45" /> </Canvas.RenderTransform> <Canvas.Triggers> <EventTrigger RoutedEvent=" Rectangle.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation RepeatBehavior ="Forever" Storyboard.TargetName="my Transform" Storyboard.TargetProperty="AngleY" From="0" To="60" Duration="0:0:10" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> </Canvas> </Canvas> |
||
Описание | ||
Смещение фигуры в вертикальном направлении | ||
№ | Код | Вид в браузере |
7.9.7 | ||
<Canvas xmlns="http://schemas.microsoft.com/ client/2007" xmlns:x="http://schemas.microsoft.com/ winfx/2006/xaml" Width="400" Height="400" Background="White" x:Name="Page"> <!--Исходная фигура--> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <!--Повернутая фигура--> <Canvas Width="200" Height="200" Canvas.Left="0" Canvas.Top="0" RenderTransformOrigin="1,1"> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="50" Fill="yellow" Stroke="red" StrokeThickness="4"/> <Rectangle Canvas.Left="200" Canvas.Top="200" Width="50" Height="25" Fill="green" Stroke="red" StrokeThickness="4" /> <Canvas.RenderTransform> <TransformGroup> <SkewTransform x:Name=" mySkewTransform" AngleY="45" /> <RotateTransform x:Name=" myRotateTransform" Angle="45"/> </TransformGroup> </Canvas.RenderTransform> <Canvas.Triggers> <EventTrigger RoutedEvent=" Rectangle.Loaded"> <BeginStoryboard> <Storyboard> <DoubleAnimation RepeatBehavior= "Forever" Storyboard.TargetName="my SkewTransform" Storyboard.TargetProperty="AngleY" From="0" To="60" Duration="0:0:10" AutoReverse="True" /> <DoubleAnimation Repeat Behavior="Forever" Storyboard.TargetName="myRotate Transform" Storyboard.TargetProperty="Angle" From="0" To="360" Duration="0:0:10" AutoReverse="True" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Canvas.Triggers> </Canvas> </Canvas> |
||
Описание | ||
Комбинация преобразований – смещение фигуры с одновременным вращением |