2011-04-15 74 views
7

我已經實現以下方式網格控制的移動的動畫:改進動畫平滑度(控件移動)

<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

感謝您的幫助!

P.S.我試圖在XAML中放置儘可能多的代碼,所以我更喜歡這種方法,但實際上,如果有什麼需要改進的話...

回答

11

使用緩動函數,簡單的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

另請注意,持續時間對動畫效果有很大影響,具體取決於您使用的緩衝功能設置高持續時間值,因爲它們在最後顯着減慢。

+0

謝謝你,這改善了我的動畫。但有一點需要注意,動畫在抖動方面的表現是相同的,但我認爲這是由於相當短的時間 - 因此,使用渲染變換或厚度動畫似乎產生了相同的結果。你提供的鏈接非常有用,特別感謝你。 – Boris 2011-04-15 08:54:34

+0

我找到了一個頁面,介紹瞭如何影響WPF應用程序的幀速率。該頁面文章實際上解釋瞭如何降低幀速率,但在我的情況下,我需要相反的。所以,我將幀率從默認的60增加到了120,現在應用程序動畫就像一個魅力。這裏是鏈接到文章http://marlongrech.wordpress.com/2008/06/13/wpf-reducing-cpu-consumption-for-animations/ – Boris 2011-04-15 12:22:08

+0

問題是有多少用戶會從中受益,如果顯示器確實不支持足夠高的刷新率,它看起來會比60fps更糟糕。 (我估計絕大多數便攜式計算機的刷新頻率爲60Hz,默認情況下可能最適合,即使對於臺式電腦,我懷疑你通常沒有發現頻率高於96Hz的原始頻率) – 2011-04-15 12:40:44