【问题标题】:Improve animation smoothness (moving of controls)提高动画流畅度(控件的移动)
【发布时间】:2011-04-15 01:27:50
【问题描述】:

我已经通过以下方式实现了网格控件的移动动画:

<Grid 
    HorizontalAlignment="Center" 
    VerticalAlignment="Center">
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <Grid.Style>
    <Style TargetType="Grid">
      <Style.Triggers>
        <DataTrigger 
            Binding="{Binding ElementName=rootLayout, Path=IsVisible}" 
            Value="True">
          <DataTrigger.EnterActions>
            <BeginStoryboard>
              <Storyboard>
                <ThicknessAnimation 
                    Storyboard.TargetProperty="Margin"                      
                    From="-500,0,0,0"
                    To="0,0,0,0" 
                    Duration="0:0:0.5" />
              </Storyboard>
            </BeginStoryboard>
          </DataTrigger.EnterActions>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Grid.Style>

  <Border 
      Grid.RowSpan="2" 
      Background="Black"
      CornerRadius="6" >          
    <Border.Effect>
      <DropShadowEffect />
    </Border.Effect>
  </Border>

  <TextBlock 
      Grid.Row="0" 
      Width="400" 
      Height="200" 
      Margin="20,20,20,10" 
      Text="{Binding Path=MessageText}" />

  <Button 
      Grid.Row="1" 
      Margin="20,5,20,15" 
      HorizontalAlignment="Right" 
      Width="75" 
      Content="OK" 
      Command="{Binding Path=CloseDialogCommand}" />

</Grid>

动画效果很好,但很丑。它摇摇欲坠/紧张不安/生涩,看起来真的不专业。有没有办法改善这一点?我是否使用正确的方法为Margin 属性上的值更改设置动画以移动网格?我读过RenderTransform,但我不知道如何在我的情况下使用它。

此外,动画看起来不自然。我知道这可以改进,但我不知道如何。这些属性是什么?它们可以帮助我增强动画效果吗:

  • AccelerationRatio
  • DecelerationRatio
  • EasingFunction
  • IsAdditive
  • IsCumulative
  • SpeedRatio

感谢您的帮助!

附:我正在尝试在 XAML 中放置尽可能多的代码,所以我更喜欢这种方法,但实际上,如果有什么可以改进的......

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    使用缓动函数,一个简单的 DoubleAnimation 和 RenderTransform,例如

    <Button Content="Test">
        <Button.RenderTransform>
            <TranslateTransform/>
        </Button.RenderTransform>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="RenderTransform.X"
                                         From="-500" To="0">
                            <DoubleAnimation.EasingFunction>
                                <CubicEase EasingMode="EaseOut"/>
                            </DoubleAnimation.EasingFunction>
                        </DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    

    这应该很流畅,请查看 this overview 缓动函数以了解它们如何影响动画。

    另请注意,持续时间对动画的外观有很大影响,具体取决于您使用的缓动函数设置高持续时间值是必要的,因为它们在结束时会显着减慢。

    【讨论】:

    • 谢谢,这改进了我的动画。需要注意的是,动画在抖动方面的表现是相同的,但我认为这是由于持续时间很短 - 因此,就这一点而言,使用渲染变换或厚度动画似乎会产生相同的结果。您提供的链接非常有用,特别感谢您。
    • 我找到了一个页面,其中解释了如何影响 WPF 应用程序的帧速率。页面文章实际上解释了如何降低帧速率,但在我的情况下,我需要相反。因此,我将帧速率从默认的 60 提高到 120,现在应用程序动画效果非常好。这是文章的链接marlongrech.wordpress.com/2008/06/13/…
    • 问题是有多少用户会从中受益,如果显示器不支持足够高的刷新率,它看起来会比 60fps 时更糟糕。 (我估计绝大多数便携式计算机的刷新率为 60Hz,默认值可能最适合,即使对于台式机,我怀疑您通常不会经常发现频率高于 96Hz 的运动)
    • 完全同意!但是,我在笔记本电脑上编码,它的刷新率为 60Hz,一旦我将帧速率值从 60 更改为 120,它实际上确实有所作为。不知道怎么做,但它确实有助于动画流畅度。我用两个帧速率值对结果进行了三次检查,老实说,我看到了改进。奇怪...
    猜你喜欢
    • 2012-01-14
    • 2013-05-03
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-03-01
    • 2012-04-16
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多