none
Как создать анимацию, не используя Storyboard? RRS feed

  • Общие обсуждения

  • Как Silverlight разработчик вы, наверное знаете, как создавать анимацию, используя Storyboard. Ингода его бывает недостаточно, например, при разработке игры часто требуется выполнять такие действия, как перемещение объекта в заданную точку по таймеру. Есть 2 решения анимации сцены без Storyboard. Одно из них заключается в использовании DispatcherTimer, а другое – в обработке события CompositionTarget.Rendering.

    DispatcherTimer

    DispatcherTimer является потоко-безопасным таймером. Каждая обработка тика таймера происходит в UI потоке. Это означает, что вы можете использовать его не беспокоясь о вопросах, связанных с потоками. Он отличается от System.Threading.Timer, событие тика которого происходит в отдельном потоке. Ниже приведен пример работы:

    <Ellipse x:Name="ell" Fill="Blue" Width="100" Height="100" Canvas.Left="300" Canvas.Top="300">
         <Ellipse.RenderTransform>
              <TranslateTransform x:Name="tran"/>
         </Ellipse.RenderTransform>
    </Ellipse>
    
    
    private DispatcherTimer timer = new DispatcherTimer();
    private Random random = new Random();
    private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
    {
         timer.Interval = TimeSpan.FromSeconds(1);
         timer.Tick += new EventHandler(timer_Tick);
         timer.Start();
    }
     
    void timer_Tick(object sender, EventArgs e)
    {
         this.tran.X += random.Next(-10, 10);
         this.tran.Y += random.Next(-10, 10);
    }
    
    

    Обратите внимание на функцию обратного вызова таймер – мы можем непосредственно изменять объекты пользовательского интерфейса без использования вызова Dispatcher.BeginInvoke. Как правило, если вы хотите сделать анимацию, но не знаете точных значений начала и конца анимации, то вам нужно использовать DispatcherTimer.

     

    CompositionTarget.Rendering

    Событие  CompositionTarget.Rendering зажигается каждый раз, когда визуализируется кадр. Это дает возможность изменить конечный вид кадра:

    CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
     
    void CompositionTarget_Rendering(object sender, EventArgs e)
    {
         this.tran.X += random.Next(-10, 10);
         this.tran.Y += random.Next(-10, 10);
    }
    
    

    Событие зависит от мощности компьютера, на котором выполняется приложение. На другом компьютере скорость анимации может быть совсем другой (больше или меньше кадров в секунду будет отрисовываться). Не используйте это событие для построения основной анимации. Обрабатывайте событие, если вам нужно точно знать, что анимация не теряет ни одного кадра.

     


    Для связи [mail]
    16 марта 2011 г. 13:46
    Модератор