0

コントロールのX、Y座標を移動すると、「ジッター」の問題が発生します。基本的に、2つの異なる方法で動作するアニメーションを取得しました。1)XプロパティのTranslateTransformと、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);
    }

これを達成するためのより良い方法はありますか、それとも何か間違った設定がありますか?どんな助けでもいただければ幸いです。

4

1 に答える 1

2

通常、WPF のアニメーションでは、これらの方法のどちらでも問題ありません。画像がスムーズに動かない場合、いくつか質問があります。

  1. 画像の大きさは?
    • 大きな画像はレンダリングに時間がかかるため、アニメーション化もされません。
  2. イメージをネイティブ解像度でレンダリングしていますか?
    • 大きな画像と同様に、レンダリングされたピクセルの計算に時間がかかるため、スケーリングによってレンダリングが遅くなる可能性があります。
  3. グラフィックカードの性能は?また、ドライバは最新ですか?
    • WPF は、十分でない場合を除き、グラフィック カードを使用してレンダリングします。ソフトウェア レンダリングにフォールバックする必要がある場合は、すべてが遅くなります。
  4. 画像の移動距離は?
    • 画像が移動するほど、1 秒あたりに描画されるフレーム数が少なくなり、アニメーションの外観がぎくしゃくする可能性があります。

画像の動きが速すぎるためにフレームレートの問題である場合は、Timeline.DesiredFrameRateプロパティを設定して目的のフレームレートを上げることができます。

Timeline.SetDesiredFrameRate(animation, 120);;

WPF では、デフォルトのターゲット フレームレートは 60 であり、決して保証されません。しかし、この添付プロパティの主な用途の 1 つは、水平方向の引き裂きを減らすことなので、役立つかもしれません。

于 2011-08-05T20:59:43.577 に答える