WPF Jitters с TranslateTransform и Canvas.SetLeft - PullRequest
0 голосов
/ 05 августа 2011

Я сталкиваюсь с проблемой "дрожания" при перемещении координат X, Y элементов управления.По сути, я получил анимацию для работы двумя различными способами: 1) TranslateTransform свойства X и 2) Таймер, который вызывает Canvas.SetLeft.И то и другое заставляет изображение двигаться, но не плавно.

XAML:

<Canvas Margin="0" Name="CanvasContainer">
    <Canvas Margin="0" Name="FirstCanvas" Background="White">
        <Image Name="FirstImage" Opacity="1" Margin="0,0,0,0" Canvas.Left="0" Canvas.Top="0" Source="someImage.png" />
    </Canvas>
    <Canvas Margin="0" Name="SecondCanvas" Background="DarkOrange">
        <Image Name="SecondImage" Opacity="1" Margin="0,0,0,0"   Canvas.Left="0" Canvas.Top="0" Source="anotherImage.png" />
    </Canvas>
</Canvas>

TranslateTransform:

    private void StartMovement(double startX, double endX, double milliseconds = 1000)
    {
        GuiDispatcher.Invoke(DispatcherPriority.Normal, new Action<Canvas, double, double, double>(MoveTo), Canvas, startX, endX, milliseconds);
    }

    private void MoveTo(Canvas canvas, double startX, double endX, double milliseconds)
    {
        canvas.RenderTransform = new TranslateTransform();
        var animation = new DoubleAnimation(startX, endX, TimeSpan.FromMilliseconds(milliseconds));
        canvas.RenderTransform.BeginAnimation(TranslateTransform.XProperty, animation);
    }

Есть ли лучший способ для этого,или я что-то настроил неправильно?Любая помощь будет оценена.

1 Ответ

2 голосов
/ 06 августа 2011

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

  1. Насколько велика картинка?
    • Рендеринг больших изображений занимает больше времени и, следовательно, также не анимируется.
  2. Вы рендеринг изображения в собственном разрешении?
    • Как и большие изображения, масштабирование может замедлить рендеринг, поскольку для вычисления отрисованных пикселей требуется больше времени.
  3. Насколько хороша ваша видеокарта? И ваши драйверы в курсе?
    • WPF использует вашу видеокарту для рендеринга, если она недостаточно хороша. Если возникает необходимость в программном рендеринге, все становится вялым.
  4. Как далеко изображение движется?
    • Чем дальше изображение перемещается, тем меньше кадров будет отображаться в секунду, что может привести к тому, что анимация будет прерывистой.

Если это проблема частоты кадров, так как изображение движется слишком далеко, вы можете увеличить желаемую частоту кадров, установив свойство Timeline.DesiredFrameRate:

Timeline.SetDesiredFrameRate(animation, 120);;

В WPF целевая частота кадров по умолчанию равна 60 и ни в коем случае не гарантируется. Но одно из основных применений этого присоединенного свойства - уменьшить разрыв по горизонтали, поэтому это может помочь.

...