0

在移动控件的 X、Y 坐标时,我遇到了“抖动”问题。基本上,我让动画以两种不同的方式工作:1) X 属性的 TranslateTransform,以及 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>

翻译变换:

    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. 图像移动多远?
    • 图像移动得越远,每秒绘制的帧数就越少,这可能会使动画看起来很生涩。

如果这是一个帧率问题,因为图像移动得太快太快,您可以通过设置Timeline.DesiredFrameRate属性来增加所需的帧率:

Timeline.SetDesiredFrameRate(animation, 120);;

在 WPF 中,默认目标帧率是 60,并且绝不保证。但是这个附加属性的主要用途之一是减少水平撕裂,所以它可能会有所帮助。

于 2011-08-05T20:59:43.577 回答