WPF使用TranslateTransform和Canvas.SetLeft进行抖动

时间:2011-08-05 19:47:20

标签: c# wpf animation .net-4.0 kinect

当移动控件的X,Y坐标时,我遇到了“抖动”的问题。基本上,我有一个动画以两种不同的方式工作:1)TranslateTransform的X属性,和2)一个调用Canvas.SetLeft的Timer。两者都会导致图像移动,但不会平滑。

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 个答案:

答案 0 :(得分:2)

这些方法中的任何一种对于WPF中的动画通常都很好。如果图像移动不顺畅,我会提出一些问题。

  1. 图片有多大?
    • 大图像渲染时间较长,因此也不会生成动画。
  2. 您是以原始分辨率渲染图像吗?
    • 与大图像一样,缩放会降低渲染速度,因为计算渲染像素需要更长时间。
  3. 你的显卡有多好?你的司机是最新的吗?
    • WPF使用您的图形卡进行渲染,除非它不够好。如果必须回退到软件渲染,一切都会变得迟缓。
  4. 图像移动多远?
    • 图像移动的距离越远,每秒绘制的帧数就越少,这可能会让动画看起来不稳定。
  5. 如果由于图像移动太快而导致帧率问题,您可以通过设置Timeline.DesiredFrameRate属性来增加所需的帧速率:

    Timeline.SetDesiredFrameRate(animation, 120);;
    

    在WPF中,默认目标帧速率为60,并不能保证。但这种附属性的主要用途之一是减少水平撕裂,因此它可能有所帮助。