WPF學習 第十五章 動畫基礎

15 動畫基礎

15.1使用代碼創建動畫

private void Button1_Click(object sender,RoutedEventArgs e)

{

           DoubleAnimation widthAnimation = new DoubleAnimation();

            widthAnimation.From = 160;

           widthAnimation.To = 300;

           widthAnimation.Duration = TimeSpan.FromSeconds(1);

           Button1.BeginAnimation(Button.WidthProperty, widthAnimation);

}

From:起始值

To:目標值

Duration:動畫持續時間,除了用TimeSpan還可以用Duration.Automatic和Duration.Forever

By:可用來代替To,說明目標值是相對起始值的偏移。如果From=160,To=300相當於From=160,By=140

IsAdditive:bool類型,說明From和To都是相對元素的當前值。如果:IsAdditive=true,則From=160相當於是160+Button.ActualWidth,To相當於是300+ Button.ActualWidth

AutoReverse:設置爲true則動畫執行完會反向執行

FillBehavior:值爲FillBehavior.Stop則執行完動畫後會回到原來直線動畫前的狀態, 值爲FillBehavior.HoldEnd則保持執行動畫後的狀態。

Completed:值是一個事件處理函數,表面動畫執行完處理該事件。

將BeginAnimation的第二個參數設置爲null來停止動畫。

例如:Button1.BeginAnimation(Button.WidthProperty, null);

BeginTime:動畫開始前等待一段時間

SpeedRatio:動畫的執行速度,默認是1。

AccelerationRatio:動畫執行開始時加速,隨後勻速

DecelerationRatio:動畫在結束時減速

RepeatBehavior:重複次數,可以無限重複RepeatBehavior.Forever

15.2 使用故事板和觸發器創建動畫

<Button Name="Button1"Content="Button" VerticalAlignment="Center"HorizontalAlignment="Center" Width="75"Height="30">

           <Button.Triggers>

                <EventTriggerRoutedEvent="Button.Click">

                   <EventTrigger.Actions>

                        <BeginStoryboard>

                            <Storyboard>

                               <DoubleAnimation Storyboard.TargetName="Button1"

                                                Storyboard.TargetProperty="Width"

                                                To="300" Duration="0:0:0.2">                               

                                </DoubleAnimation>

                            </Storyboard>

                       </BeginStoryboard>

                   </EventTrigger.Actions>

                </EventTrigger>

           </Button.Triggers>

       </Button>

說明:

1.故事板一般需要用事件觸發器來調用。

2.代碼中由於故事板寫在了Button裏面,所以Storyboard.TargetName="Button1"這一句可以省略。

3.如果故事板使用的屬性是附加屬性(如Canvas.Left)則需要加個括號寫成下面形式:

<DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)"

4.動畫中的To使用了硬編碼的值300,如果想用窗口的寬度表示需要使用數據綁定,可寫成下面形式:

<DoubleAnimation Storyboard.TargetProperty="Width"To="{BindingElementName=window1, Path=Width}"

5.也可以用樣式關聯觸發器,可以使用屬性觸發器和事件觸發器。下面是屬性觸發器的代碼:

<Window.Resources>

       <Style x:Key="buttonStyle">

           <Style.Triggers>

                <TriggerProperty="Button.IsPressed" Value="True">

                   <Trigger.EnterActions>

                        <BeginStoryboard>

                            <Storyboard>

                               <DoubleAnimation

                                                Storyboard.TargetProperty="Width"

                                                 To="300"Duration="0:0:0.2">

                               </DoubleAnimation>

                            </Storyboard>

                       </BeginStoryboard>

                   </Trigger.EnterActions>

                </Trigger>

           </Style.Triggers>

       </Style>

</Window.Resources>

<Canvas>

<ButtonStyle="{StaticResource buttonStyle}" Name="Button1"Content="Button" VerticalAlignment="Center"HorizontalAlignment="Center" Width="75"Height="30"></Button>

</Canvas>

15.3 控制播放動畫


<Window.Triggers>

       <EventTrigger SourceName="cmdStart"RoutedEvent="Button.Click">

           <BeginStoryboard Name="storyboardbegin">

                <StoryboardName="storyboard" CurrentTimeInvalidated="storyboard_CurrentTimeInvalidated">

                    <DoubleAnimationStoryboard.TargetName="pic2"Storyboard.TargetProperty="Opacity"

                                    From="1" To="0" Duration="0:0:10">

                    </DoubleAnimation>

                </Storyboard>

           </BeginStoryboard>

       </EventTrigger>

       <EventTrigger SourceName="cmdPause"RoutedEvent="Button.Click">

           <PauseStoryboard BeginStoryboardName="storyboardbegin">

           </PauseStoryboard>

       </EventTrigger>

       <EventTrigger SourceName="cmdResume"RoutedEvent="Button.Click">

           <ResumeStoryboard BeginStoryboardName="storyboardbegin">

           </ResumeStoryboard>

       </EventTrigger>

       <EventTrigger SourceName="cmdStop"RoutedEvent="Button.Click">

           <StopStoryboard BeginStoryboardName="storyboardbegin">

           </StopStoryboard>

       </EventTrigger>

       <EventTrigger SourceName="cmdMiddle"RoutedEvent="Button.Click">

           <SeekStoryboard BeginStoryboardName="storyboardbegin"Offset="0:0:5">

           </SeekStoryboard>

       </EventTrigger>

   </Window.Triggers>

   <Grid>

       <Image Name="pic1"Source="pic1.jpg"></Image>

       <Image Name="pic2"Source="pic2.jpg"></Image>

       <StackPanel Orientation="Horizontal" Height="30"Width="Auto" VerticalAlignment="Bottom"HorizontalAlignment="Center" Margin="5">

           <Button Name="cmdStart">Start</Button>

           <Button Name="cmdPause">Pause</Button>

           <Button Name="cmdResume">Resume</Button>

           <Button Name="cmdStop">Stop</Button>

           <Button Name="cmdMiddle">Middle</Button>

       </StackPanel>

       <ProgressBar Name="progressbar"HorizontalAlignment="Center" Height="20"Margin="10" VerticalAlignment="Top" Width="200"Value="0" Minimum="0" Maximum="1"/>

</Grid>

 

private voidstoryboard_CurrentTimeInvalidated(object sender, EventArgs e)

        {

            Clock storyboardclock =(Clock)sender;

            if (storyboardclock.CurrentProgress== null)

            {

                progressbar.Value = 0;

            }

            else

            {

                progressbar.Value =(double)storyboardclock.CurrentProgress;

            }

        }

說明:

1.控制故事板的動作類包括:BeginStoryboard、PauseStoryboard、ResumeStoryboard、StopStoryboard、SeekStoryboard等。

2.監視動畫進度使用代碼實現,故事板的當前時間向前移動時觸發

CurrentTimeInvalidated事件,通過故事板的CurrentProgress屬性獲取當前的進度(0到1)。

15.4實現動畫緩動效果


<Window.Triggers>
        <EventTrigger SourceName="Button1" RoutedEvent="Button.Click">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="Button1" Storyboard.TargetProperty="(Canvas.Top)" To="150" Duration="0:0:10">
                        <DoubleAnimation.EasingFunction>
                            <ElasticEase EasingMode ="EaseOut" Oscillations="10"></ElasticEase>
                        </DoubleAnimation.EasingFunction>
                    </DoubleAnimation>
                </Storyboard>
            </BeginStoryboard>
            
        </EventTrigger>
    </Window.Triggers>
    <Canvas>
        <Button Name="Button1" Canvas.Left="200" Canvas.Top="50" Height="50" Width="50" VerticalAlignment="Center" HorizontalAlignment="Center">Button
        </Button>
    </Canvas>

說明:

1.動畫緩動效果使得動畫不再是線性執行,而是按照某個定義的動畫函數來變化。

2.WPF提供了多種緩動效果,ElasticEase是擺動效果,就像皮球從高處落地再彈起再落地這樣反覆的過程。

3.EaseIn和EaseOut表示在緩動效果是先緩後急還是先急後緩。

4.其它的緩動效果有:BackEase、BounceEase、CircleEase、CubicEase、ElasticEase、PowerEase、SineEase等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章