Цель работы: Научиться выводить и анимировать изображения в
Создадим новый HyperlinkButton на
Мы хотим разместить на нашей новой странице несколько Ellipse ( (Прямоугольник). Это – объекты, принадлежащие пространству имён System.Windows.
Для .
(рис 30.1) Выбор элементов
Фигуры можно добавлять на страницу так же, как мы добавляли элементы управления, у фигур есть свойства, которые можно настраивать, есть события, которые можно обрабатывать.
Если говорить о таких фигурах, например, как
Добавим на страницу несколько фигур, так, чтобы в итоге у нас получилось следующее, рис. 30.2.
(рис 30.2) Фигуры на Silverlight-странице
Рассмотрим некоторые особенности работы с фигурами, для начала приведем
<phone:PhoneApplicationPage
x:Class="P23_1.Shapes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel содержит имя приложения и заголовок страницы-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="МОЕ ПРИЛОЖЕНИЕ"
Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="фигуры" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Rectangle Height="149" HorizontalAlignment="Left" Margin="47,309,0,0" Name="rectangle1"
Stroke="#FFC1C143" StrokeThickness="15" VerticalAlignment="Top" Width="191" />
<Ellipse Height="100" HorizontalAlignment="Left" Margin="187,250,0,0" Name="ellipse2"
Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="100">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#E9FFFFFF" Offset="0" />
<GradientStop Color="#E304121A" Offset="0.994" />
<GradientStop Color="#F106639F" Offset="0.517" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Polygon Height="163" HorizontalAlignment="Left" Margin="143,399,0,0" Name="polygon1"
Stroke="#FFA04BC4" StrokeThickness="10" VerticalAlignment="Top" Width="233" Fill="{x:Null}">
<Polygon.Points>
<Point>0,0</Point>
<Point Y="100" />
<Point X="100" Y="100" />
</Polygon.Points>
</Polygon>
<Ellipse Height="222" HorizontalAlignment="Left" Margin="12,49,0,0" Name="ellipse1"
Stroke="#FF2B2BA0" StrokeThickness="10" VerticalAlignment="Top" Width="416" Fill="#FF32B132" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>
Обратите внимание на порядок следования описаний фигур. От этого порядка зависит и порядок их вывода. Так, большой овал в верхней части изображения расположен над остальными фигурами. Его описание расположено последним в коде. Когда мы добавляем новые фигуры на страницу, они расположены в порядке добавления.
Если фигуры перекрываются и нам нужно изменить этот порядок, можно либо воспользоваться командами контекстного меню фигуры Порядок (здесь доступны такие варианты, как На передний план, Переместить вперед, Переместить назад, На задний план), рис. 30.3. Можно самостоятельно переместить участок кода в
(рис 30.3) Настройка свойств фигуры
Размер фигур можно настраивать в визуальном режиме, например, на рис. 30.3 видны маркеры изменения размера вокруг выделенного
Рассмотрим свойства фигур, которыми мы пользовались в этом примере, опираясь на их
<Ellipse Height="222" HorizontalAlignment="Left" Margin="12,49,0,0" Name="ellipse1" Stroke="#FF2B2BA0" StrokeThickness="10" VerticalAlignment="Top" Width="416" Fill="#FF32B132" />
<p>Height – высота элемента
HorizontalAlighment – выравнивание по горизонтали
– расстояние между элементом и другими элементами. В данном случае задаётся для левой, верхней, правой и нижней сторон объекта и отражает расположение объекта на экране относительно ячейки сетки (она имеет имя ContentPanel), в которой расположены объекты. При изменении положения объекта на странице именно здесь записывается его новое положение.
Name – имя элемента
– цвет обводки в шестнадцатеричном формате, с альфа-каналом, отвечающим за прозрачность. Первое значение в описании цвета (#FF2B2BA0), FF, указывает на то, что объект непрозрачен, три других – 2B, 2B, A0 – задают, соответственно, красную, зеленую и синюю составляющие итогового цвета. Цвета удобно задавать в панели Свойства – при попытке редактирования свойства, подразумевающего установку цвета, появляется окно настройки цвета (рис. 30.4). Причём, здесь возможно не только настраивать цвета, но и задавать, например, тип заливки и некоторые другие параметры.
(рис 30.4) Настройка цвета обводки
StrokeThickness – толщина обводки
VerticalAlignment – выравнивание по вертикали
Width - ширина
Fill – заливка
Рассмотрим свойства следующей фигуры в коде. Это – многоугольник, представленный в нашем проекте в виде треугольника, листинг 23.3.,
<Polygon Height="163" HorizontalAlignment="Left" Margin="143,399,0,0" Name="polygon1" Stroke="#FFA04BC4"
StrokeThickness="10" VerticalAlignment="Top"
Width="233" Fill="{x:Null}">
<Polygon.Points>
<Point>0,0</Point>
<Point Y="100" />
<Point X="100" Y="100" />
</Polygon.Points>
</Polygon>
Подавляющее большинство его свойств вам уже знакомы. У многоугольника есть одна важная особенность. Для того чтобы задать его, нужно указать координаты точек, которые в него входят. Эти точки будут соединены замкнутой линией. Если обратиться к свойству объекта Points в панели Свойства, откроется окно, рис. 30.5.
(рис 30.5) Редактор коллекции Points
Здесь можно добавлять в многоугольник точки (в левой части окна), и настраивать свойства точек (X и Y) в правой части.
Обратите внимание на то, что координаты точек задаются относительно левого верхнего угла границы фигуры, рис. 30.6.
(рис 30.6) Границы фигуры, начало координат для элементов многоугольника
У многоугольника задана граница толщиной в 10 пикселей, она равномерно выводится вокруг линий, задающих стороны фигуры, в итоге, выходит за пределы ограничивающей рамки.
Наша следующая фигура, листинг 23.4, представляет собой
<Ellipse Height="100" HorizontalAlignment="Left" Margin="187,250,0,0" Name="ellipse2"
Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="100">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#E9FFFFFF" Offset="0" />
<GradientStop Color="#E304121A" Offset="0.994" />
<GradientStop Color="#F106639F" Offset="0.517" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
Высота и ширина
Для задания
(рис 30.7) Настройка параметров градиентной заливки
Для настройки параметров
Наш последний элемент в данном примере – прямоугольник – ничем особым не примечателен, вы без труда сами разберетесь в его свойствах на основе того, о чём мы говорили выше.
Поговорив о стандартных фигурах, остановимся теперь на трансформации объектов.
Трансформация в UIElement. На практике оказывается, что это – текст, изображения, фигуры, элементы управления, другие элементы. В UIElement есть свойство RenderTransform, которому можно назначать объект типа Transform (System.Windows.Media.Transform). В частности, существуют следующие классы (из пространства имён System.Windows.Media), которые можно использовать при настройке данного свойства:
CompositeTransform (Составная трансформация) – позволяет задавать несколько операций трансформации в определенной последовательностиMatrixTransform (Трансформация с использованием матрицы) – позволяет выполнять трансформации с использованием матрицыRotateTransform (Трансформация вращением) – позволяет вращать объектыScaleTransform (Трансформация масштабированием) – позволяет управлять размером объектаSkewTransform (Трансформация наклонением) – позволяет смещать одни части объекта относительно других (как бы перекашивает объект, превращая, например, прямоугольник в параллелограмм)TransformGroup (Группа трансформаций) – позволяет комбинировать несколько трансформацийTranslateTransform (Трансформация переносом) – позволяет менять местоположение объектаЗадавать трансформации можно как в
Рассмотрим пример описания трансформации в
Добавим на страницу новый 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>
Внутри описания элемента мы задаем свойства для RenderTransform. Два трансформированных фрагмента текста демонстрируют трансформации SkewTransform и RotateTransform. К кнопке мы применили сразу две трансформации, для этого нам понадобилось использовать тег TransformGroup (фактически, воспользовались группой трансформаций). Сначала мы применили трансформацию перекоса, потом – масштабирования.
Итог работы вышеприведенного кода вы можете видеть на рис. 30.8.
(рис 30.8) Итог применения трансформаций
Обратите внимание на то, что взаимодействие пользователя с трансформированными элементами управления выглядит так же, как с обычными. То есть, например, нажатие на кнопку обрабатывается в соответствии с её новым местоположением.
Рассмотрим теперь анимацию объектов с использованием трансформаций и события
Добавим в наш проект новую страницу, назовем ее SimpleAnimation. Добавим на страницу
<Ellipse Height="100"
HorizontalAlignment="Left"
Margin="134,501,0,0"
Name="ellipse1"
Stroke="Black"
StrokeThickness="1"
VerticalAlignment="Top"
Width="100"
Fill="#FF00CB00">
<Ellipse.RenderTransform>
<TranslateTransform x:Name="translate" />
</Ellipse.RenderTransform>
</Ellipse>
Обратите внимание, здесь мы задаём в настройках трансформации TranslateTransform, указывая для этой трансформаци имя (x:Name) – ellipse1.
Мы собираемся организовать автоматическое перемещение объекта CompositionTarget, который представляет собой отображаемую поверхность приложения. Фактически, перехватив это событие мы получаем SimpleAnimation() в файле SimpleAnimation.
Одну, подписанную как Старт (button1), будем нажимать для запуска перемещения объекта по экрану со случайными значениями X и Y, вторую (Сброс, button2) будем использовать для возврата объекта в исходную позицию и прекращения перемещения.
Код файла SimpleAnimation.
7using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace P23_1
{
public partial class SimpleAnimation : PhoneApplicationPage
{
double speedAndDirX = 0;
double speedAndDirY = 0;
bool isAnimated = false;
public SimpleAnimation()
{
InitializeComponent();
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
if (isAnimated)
{
translate.X += speedAndDirX;
translate.Y += speedAndDirY;
}
}
private void button2_Click(object sender, RoutedEventArgs e)
{
isAnimated = false;
translate.X = 0;
translate.Y = 0;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Random r = new Random();
speedAndDirX = r.Next(5) - r.Next(5);
speedAndDirY = r.Next(5) - r.Next(5);
isAnimated = true;
}
}
}
На рис. 30.9 в можете видеть страницу SimpleAnimation.
(рис 30.9) Страница SimpleAnimation.xaml
Рассмотрим еще один вариант анимации – с использованием инструментов, доступных в Expression
Создадим новую страницу, BlendAnimation, разместим на ней
В Expression
(рис 30.10) Страница в Expression Blend
На закладке Objects and
(рис 30.11) Новая анимация
Нажмем на кнопку ОК. В панели Objects and LayoutRoot и нажмём кнопку
(рис 30.12) Запись первого ключевого кадра
Первый
Переместим жёлтый указатель на шкале времени, после чего изменим размеры и положение
(рис 30.13) Изменение размеров и положения эллипса
Теперь, когда у нас есть уже два ключевых кадра, мы можем просмотреть полученную анимацию, для этого нажмём на кнопку Play на панели Objects and
(рис 30.14) Настройка параметров анимации
Сохраним проект (можно закрыть окно Expression
Того, что мы сделали сейчас, недостаточно для запуска анимации. Нам нужно запустить её самостоятельно. Это можно сделать в файле кода страницы, например, в обработчике события DoubleTap (двойное прикосновение) для
private void ellipse1_DoubleTap(object sender, GestureEventArgs e)
{
EllipseAnimation.Begin();
}
В этой лабораторной работе мы рассмотрели вывод двумерных изображений в
Изучите различные способы трансформации объектов. Поэкспериментируйте с покадровой анимацией, основанной на , используя различные варианты трансформаций. Исследуйте возможности Expression
К данной лабораторной работе прилагается видеоурок
и демонстрационный проект.
Цель работы: Научиться выводить и анимировать изображения в
Создадим новый HyperlinkButton на
Мы хотим разместить на нашей новой странице несколько Ellipse ( (Прямоугольник). Это – объекты, принадлежащие пространству имён System.Windows.
Для .
(рис 30.1) Выбор элементов
Фигуры можно добавлять на страницу так же, как мы добавляли элементы управления, у фигур есть свойства, которые можно настраивать, есть события, которые можно обрабатывать.
Если говорить о таких фигурах, например, как
Добавим на страницу несколько фигур, так, чтобы в итоге у нас получилось следующее, рис. 30.2.
(рис 30.2) Фигуры на Silverlight-странице
Рассмотрим некоторые особенности работы с фигурами, для начала приведем
<phone:PhoneApplicationPage
x:Class="P23_1.Shapes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel содержит имя приложения и заголовок страницы-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="МОЕ ПРИЛОЖЕНИЕ"
Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="фигуры" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Rectangle Height="149" HorizontalAlignment="Left" Margin="47,309,0,0" Name="rectangle1"
Stroke="#FFC1C143" StrokeThickness="15" VerticalAlignment="Top" Width="191" />
<Ellipse Height="100" HorizontalAlignment="Left" Margin="187,250,0,0" Name="ellipse2"
Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="100">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#E9FFFFFF" Offset="0" />
<GradientStop Color="#E304121A" Offset="0.994" />
<GradientStop Color="#F106639F" Offset="0.517" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<Polygon Height="163" HorizontalAlignment="Left" Margin="143,399,0,0" Name="polygon1"
Stroke="#FFA04BC4" StrokeThickness="10" VerticalAlignment="Top" Width="233" Fill="{x:Null}">
<Polygon.Points>
<Point>0,0</Point>
<Point Y="100" />
<Point X="100" Y="100" />
</Polygon.Points>
</Polygon>
<Ellipse Height="222" HorizontalAlignment="Left" Margin="12,49,0,0" Name="ellipse1"
Stroke="#FF2B2BA0" StrokeThickness="10" VerticalAlignment="Top" Width="416" Fill="#FF32B132" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>
Обратите внимание на порядок следования описаний фигур. От этого порядка зависит и порядок их вывода. Так, большой овал в верхней части изображения расположен над остальными фигурами. Его описание расположено последним в коде. Когда мы добавляем новые фигуры на страницу, они расположены в порядке добавления.
Если фигуры перекрываются и нам нужно изменить этот порядок, можно либо воспользоваться командами контекстного меню фигуры Порядок (здесь доступны такие варианты, как На передний план, Переместить вперед, Переместить назад, На задний план), рис. 30.3. Можно самостоятельно переместить участок кода в
(рис 30.3) Настройка свойств фигуры
Размер фигур можно настраивать в визуальном режиме, например, на рис. 30.3 видны маркеры изменения размера вокруг выделенного
Рассмотрим свойства фигур, которыми мы пользовались в этом примере, опираясь на их
<Ellipse Height="222" HorizontalAlignment="Left" Margin="12,49,0,0" Name="ellipse1" Stroke="#FF2B2BA0" StrokeThickness="10" VerticalAlignment="Top" Width="416" Fill="#FF32B132" />
<p>Height – высота элемента
HorizontalAlighment – выравнивание по горизонтали
– расстояние между элементом и другими элементами. В данном случае задаётся для левой, верхней, правой и нижней сторон объекта и отражает расположение объекта на экране относительно ячейки сетки (она имеет имя ContentPanel), в которой расположены объекты. При изменении положения объекта на странице именно здесь записывается его новое положение.
Name – имя элемента
– цвет обводки в шестнадцатеричном формате, с альфа-каналом, отвечающим за прозрачность. Первое значение в описании цвета (#FF2B2BA0), FF, указывает на то, что объект непрозрачен, три других – 2B, 2B, A0 – задают, соответственно, красную, зеленую и синюю составляющие итогового цвета. Цвета удобно задавать в панели Свойства – при попытке редактирования свойства, подразумевающего установку цвета, появляется окно настройки цвета (рис. 30.4). Причём, здесь возможно не только настраивать цвета, но и задавать, например, тип заливки и некоторые другие параметры.
(рис 30.4) Настройка цвета обводки
StrokeThickness – толщина обводки
VerticalAlignment – выравнивание по вертикали
Width - ширина
Fill – заливка
Рассмотрим свойства следующей фигуры в коде. Это – многоугольник, представленный в нашем проекте в виде треугольника, листинг 23.3.,
<Polygon Height="163" HorizontalAlignment="Left" Margin="143,399,0,0" Name="polygon1" Stroke="#FFA04BC4"
StrokeThickness="10" VerticalAlignment="Top"
Width="233" Fill="{x:Null}">
<Polygon.Points>
<Point>0,0</Point>
<Point Y="100" />
<Point X="100" Y="100" />
</Polygon.Points>
</Polygon>
Подавляющее большинство его свойств вам уже знакомы. У многоугольника есть одна важная особенность. Для того чтобы задать его, нужно указать координаты точек, которые в него входят. Эти точки будут соединены замкнутой линией. Если обратиться к свойству объекта Points в панели Свойства, откроется окно, рис. 30.5.
(рис 30.5) Редактор коллекции Points
Здесь можно добавлять в многоугольник точки (в левой части окна), и настраивать свойства точек (X и Y) в правой части.
Обратите внимание на то, что координаты точек задаются относительно левого верхнего угла границы фигуры, рис. 30.6.
(рис 30.6) Границы фигуры, начало координат для элементов многоугольника
У многоугольника задана граница толщиной в 10 пикселей, она равномерно выводится вокруг линий, задающих стороны фигуры, в итоге, выходит за пределы ограничивающей рамки.
Наша следующая фигура, листинг 23.4, представляет собой
<Ellipse Height="100" HorizontalAlignment="Left" Margin="187,250,0,0" Name="ellipse2"
Stroke="Black" StrokeThickness="1" VerticalAlignment="Top" Width="100">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#E9FFFFFF" Offset="0" />
<GradientStop Color="#E304121A" Offset="0.994" />
<GradientStop Color="#F106639F" Offset="0.517" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
Высота и ширина
Для задания
(рис 30.7) Настройка параметров градиентной заливки
Для настройки параметров
Наш последний элемент в данном примере – прямоугольник – ничем особым не примечателен, вы без труда сами разберетесь в его свойствах на основе того, о чём мы говорили выше.
Поговорив о стандартных фигурах, остановимся теперь на трансформации объектов.
Трансформация в UIElement. На практике оказывается, что это – текст, изображения, фигуры, элементы управления, другие элементы. В UIElement есть свойство RenderTransform, которому можно назначать объект типа Transform (System.Windows.Media.Transform). В частности, существуют следующие классы (из пространства имён System.Windows.Media), которые можно использовать при настройке данного свойства:
CompositeTransform (Составная трансформация) – позволяет задавать несколько операций трансформации в определенной последовательностиMatrixTransform (Трансформация с использованием матрицы) – позволяет выполнять трансформации с использованием матрицыRotateTransform (Трансформация вращением) – позволяет вращать объектыScaleTransform (Трансформация масштабированием) – позволяет управлять размером объектаSkewTransform (Трансформация наклонением) – позволяет смещать одни части объекта относительно других (как бы перекашивает объект, превращая, например, прямоугольник в параллелограмм)TransformGroup (Группа трансформаций) – позволяет комбинировать несколько трансформацийTranslateTransform (Трансформация переносом) – позволяет менять местоположение объектаЗадавать трансформации можно как в
Рассмотрим пример описания трансформации в
Добавим на страницу новый 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>
Внутри описания элемента мы задаем свойства для RenderTransform. Два трансформированных фрагмента текста демонстрируют трансформации SkewTransform и RotateTransform. К кнопке мы применили сразу две трансформации, для этого нам понадобилось использовать тег TransformGroup (фактически, воспользовались группой трансформаций). Сначала мы применили трансформацию перекоса, потом – масштабирования.
Итог работы вышеприведенного кода вы можете видеть на рис. 30.8.
(рис 30.8) Итог применения трансформаций
Обратите внимание на то, что взаимодействие пользователя с трансформированными элементами управления выглядит так же, как с обычными. То есть, например, нажатие на кнопку обрабатывается в соответствии с её новым местоположением.
Рассмотрим теперь анимацию объектов с использованием трансформаций и события
Добавим в наш проект новую страницу, назовем ее SimpleAnimation. Добавим на страницу
<Ellipse Height="100"
HorizontalAlignment="Left"
Margin="134,501,0,0"
Name="ellipse1"
Stroke="Black"
StrokeThickness="1"
VerticalAlignment="Top"
Width="100"
Fill="#FF00CB00">
<Ellipse.RenderTransform>
<TranslateTransform x:Name="translate" />
</Ellipse.RenderTransform>
</Ellipse>
Обратите внимание, здесь мы задаём в настройках трансформации TranslateTransform, указывая для этой трансформаци имя (x:Name) – ellipse1.
Мы собираемся организовать автоматическое перемещение объекта CompositionTarget, который представляет собой отображаемую поверхность приложения. Фактически, перехватив это событие мы получаем SimpleAnimation() в файле SimpleAnimation.
Одну, подписанную как Старт (button1), будем нажимать для запуска перемещения объекта по экрану со случайными значениями X и Y, вторую (Сброс, button2) будем использовать для возврата объекта в исходную позицию и прекращения перемещения.
Код файла SimpleAnimation.
7using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace P23_1
{
public partial class SimpleAnimation : PhoneApplicationPage
{
double speedAndDirX = 0;
double speedAndDirY = 0;
bool isAnimated = false;
public SimpleAnimation()
{
InitializeComponent();
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
if (isAnimated)
{
translate.X += speedAndDirX;
translate.Y += speedAndDirY;
}
}
private void button2_Click(object sender, RoutedEventArgs e)
{
isAnimated = false;
translate.X = 0;
translate.Y = 0;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Random r = new Random();
speedAndDirX = r.Next(5) - r.Next(5);
speedAndDirY = r.Next(5) - r.Next(5);
isAnimated = true;
}
}
}
На рис. 30.9 в можете видеть страницу SimpleAnimation.
(рис 30.9) Страница SimpleAnimation.xaml
Рассмотрим еще один вариант анимации – с использованием инструментов, доступных в Expression
Создадим новую страницу, BlendAnimation, разместим на ней
В Expression
(рис 30.10) Страница в Expression Blend
На закладке Objects and
(рис 30.11) Новая анимация
Нажмем на кнопку ОК. В панели Objects and LayoutRoot и нажмём кнопку
(рис 30.12) Запись первого ключевого кадра
Первый
Переместим жёлтый указатель на шкале времени, после чего изменим размеры и положение
(рис 30.13) Изменение размеров и положения эллипса
Теперь, когда у нас есть уже два ключевых кадра, мы можем просмотреть полученную анимацию, для этого нажмём на кнопку Play на панели Objects and
(рис 30.14) Настройка параметров анимации
Сохраним проект (можно закрыть окно Expression
Того, что мы сделали сейчас, недостаточно для запуска анимации. Нам нужно запустить её самостоятельно. Это можно сделать в файле кода страницы, например, в обработчике события DoubleTap (двойное прикосновение) для
private void ellipse1_DoubleTap(object sender, GestureEventArgs e)
{
EllipseAnimation.Begin();
}
В этой лабораторной работе мы рассмотрели вывод двумерных изображений в
Изучите различные способы трансформации объектов. Поэкспериментируйте с покадровой анимацией, основанной на , используя различные варианты трансформаций. Исследуйте возможности Expression
К данной лабораторной работе прилагается видеоурок
и демонстрационный проект.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.