Главная » Разработка для Windows Phone 7 » Анимация со скоростью видео Windows Phone 7

0

Вызов DispatcherTimer с интервалом в одну секунду имеет смысл в приложении HybridClock, потому что положения стрелок часов должны обновляться не чаще, чем каждую секунду. Но с переходом к плавно перемещающейся секундной стрелке сразу же возникает вопрос, как часто необходимо обновлять стрелки часов. Учитывая то, что секундная стрелка должна перемещаться лишь на несколько пикселов в секунду, вероятно, установить таймер на 250 миллисекунд было бы приемлемым, а на 100 миллисекунд – более чем достаточно.

Не лишним будет напомнить, что экран устройств, работающих под управлением Windows Phone 7, обновляется примерно 30 раз в секунду или каждые 33-1/3 миллисекунды. Поэтому использовать для анимации таймер с тактовой частотой выше, чем раз в 33-1/3 миллисекунды, вообще не имеет смысла.

Идеальным вариантом для анимации является таймер, синхронный с частотой обновления монитора. Silverlight предоставляет такую возможность посредством одного очень простого

в использовании события CompositionTarget.Rendering. Обработчик этого события выглядит следующим образом:

void 0nCompositionTargetRendering(object sender, EventArgs args) {

TimeSpan renderingTime = (args as RenderingEventArgs).RenderingTime;

}

Несмотря на то, что обработчик события должен быть определен аргументом EventArgs (Аргументы события), в качестве аргумента фактически выступает объект RenderingEventArgs (Аргументы события формирования визуального представления). В результате приведения аргумента к RenderingEventArgs получаем объект TimeSpan (Диапазон времени), указывающий на время, прошедшее с момента запуска приложения.

CompositionTarget (Композиция приложения) – это статический класс с единственным открытым членом, которым является событие Rendering. Добавляем обработчик события следующим образом:

CompositionTarget.Rendering += 0nCompositionTargetRendering;

Если создаваемое приложение не перегружено анимацией, нет необходимости сохранять обработчик события в ходе всего выполнения приложения, поэтому удалим его сразу же после использования:

CompositionTarget.Rendering -= 0nCompositionTargetRendering;

В проекте RotatingText (Вращающийся текст) элемент TextBlock располагается в центре сетки для содержимого:

Проект: RotatingText Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Text="R0TATE!"

FontSize="9 6"

HorizontalAlignment="Center" VerticalAlignment="Center" RenderTransform0rigin="0.5 0.5"> <TextBlock.RenderTransform>

<RotateTransform x:Name="rotate" /> </TextBlock.RenderTransform> </TextBlock> </Grid>

Обратите внимание на атрибут x:Name в RotateTransform. Здесь не может использоваться Name, потому что он определен в FrameworkElement. В конструкторе в файле выделенного кода подписываемся на событие CompositionTarget.Rendering:

Проект: RotatingText Файл: MainPage.xaml.cs (фрагмент)

public partial class MainPage : PhoneApplicationPage {

TimeSpan startTime;

public MainPage() {

InitializeComponent();

CompositionTarget.Rendering += 0nCompositionTargetRendering;

}

void 0nCompositionTargetRendering(object sender, EventArgs args)

TimeSpan renderingTime = (args as RenderingEventArgs).RenderingTime;

if (startTime.Ticks == 0) {

startTime = renderingTime;

}

else {

TimeSpan elapsedTime = renderingTime – startTime; rotate.Angle = 180 * elapsedTime.TotalSeconds % 360;

}

}

}

Обработчик события использует renderingTime для отрисовки анимации, т.е. наш текст делает один оборот за две секунды.

Для реализации подобных простых повторяющихся анимаций предпочтительнее использовать не CompositionTarget.Rendering, а встроенные возможности анимации Silverlight (которые мы обсудим в главе 15).

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии