使用silverlight中的Storyboard实现动画效果

简介:
在silverlight中,可以使用StoryBoard(故事板)不实现类似于动画的效果,本文就是借助该
对象来实现一个相册显示的例子,其运行效果如下图所示(鼠标放在中间图片上,然后离开):
 
     在正文开始之后,先介绍一下Storyboard, 其定义如下:
     Controls animations with a timeline, and provides object and property targeting
information for its child animations. 

     因为它用时间线(timeline)来控制,并提供了要绑定的对象和目标属性信息。其在XAML中的
格式如下:

< Storyboard    >
    oneOrMoreChildTimelines
</ Storyboard >
   
    其中的oneOrMoreChildTimelines可以是如下任一或多个对象元素:
    
    Storyboard, ColorAnimation, ColorAnimationUsingKeyFrames, DoubleAnimation, 
    DoubleAnimationUsingKeyFrames, PointAnimation, PointAnimationUsingKeyFrames

    
    下面就其中几个主要的元素作如下演示说明,首先请看“DoubleAnimation”:
    
    DoubleAnimation:当动画值的变化(FROM ...TO...)类型是 Double型时使用。
    
    下面演示的就是矩形(MyAnimatedRectangle)的“Opacity”(透明度)属性在一秒内从1到0
的动画(参数说明见注释)。
    
< StackPanel >
       
< StackPanel.Resources >
      
<!-- 将Storyboard 放入Resources中是为了更方便的在代码中引用 Storyboard 以及进行互操作,如
start, stop, pause,和恢复Storyboard. 
-->
           
< Storyboard  x:Name ="myStoryboard" >
               
< DoubleAnimation
                  
Storyboard.TargetName ="MyAnimatedRectangle"
            Storyboard.TargetProperty
="Opacity"
            From
="1.0"
            To
="0.0"
            Duration
="0:0:1"
            AutoReverse
="True"
            RepeatBehavior
="Forever"   />
           
</ Storyboard >
       
</ StackPanel.Resources >
       
<!-- 参数说明:
           Storyboard.TargetName:附加属性操作到指定的对象上;
           Storyboard.TargetProperty:要操作指定对象的属性;
           From..To :上述属性值的起始范围;
           Duration: 在多少时间内完成上述属性值的变化;
           AutoReverse:是否在vanishes 之后 fade back 到初始状态;
           RepeatBehavior:指示当前animation 不断反复
       
-->

       
< Rectangle  MouseLeftButtonDown ="Mouse_Clicked"
   x:Name
="MyAnimatedRectangle"
   Width
="100"  Height ="100"  Fill ="Blue"   />
</ StackPanel >

    ColorAnimation:当动画值的变化(FROM ...TO...)类型是 Color型时使用。
    
    下面演示的是myStackPanel背景色在4秒内从红到绿的动画。

< StackPanel  x:Name ="myStackPanel"  Background ="Red"  Grid.Row ="0"
        Loaded
="Start_Animation" >
    
< TextBlock  Foreground ="White" > 使用层级方式绑定TargetProperty: </ TextBlock >
    
< StackPanel.Resources >
        
< Storyboard  x:Name ="colorStoryboard" >
            
< ColorAnimation  BeginTime ="00:00:00"  Storyboard.TargetName ="myStackPanel"
        Storyboard.TargetProperty
="(Panel.Background).(SolidColorBrush.Color)"
        From
="Red"  To ="Green"  Duration ="0:0:4"   />
        
</ Storyboard >
    
</ StackPanel.Resources >
</ StackPanel >

        
    下面XAML代码与上面所示的实现效果相同:
    
< StackPanel  Loaded ="Start_Animation" >
     
< TextBlock  Foreground ="White" > 普通方式绑定TargetProperty: </ TextBlock >
     
< StackPanel.Resources >
         
< Storyboard  x:Name ="colorStoryboard2" >
             
< ColorAnimation  BeginTime ="00:00:00"  Storyboard.TargetName ="mySolidColorBrush"
    Storyboard.TargetProperty
="Color"  From ="AliceBlue"  To ="Green"  Duration ="0:0:4"  FillBehavior ="Stop" />
         
</ Storyboard >
     
</ StackPanel.Resources >
     
< StackPanel.Background >
         
< SolidColorBrush  x:Name ="mySolidColorBrush"  Color ="AliceBlue"   />
     
</ StackPanel.Background >
</ StackPanel >   

  
    接下来是PointAnimation:  当动画值的变化(FROM ...TO...)类型是 Point型时使用。
    
    下面的XAML演示的是EllipseGeometry对象从point(20,200)移动到point(400,100)的动画。
    
< PointAnimation  Storyboard.TargetProperty ="Center"
  Storyboard.TargetName
="MyAnimatedEllipseGeometry"
  Duration
="0:0:5"
  From
="20,200"
  To
="400,100"
  RepeatBehavior
="Forever"   />

       
</ Storyboard >
   
</ Canvas.Resources >
< Path  Fill ="Blue" >
       
< Path.Data >
           
<!--  Describes an ellipse.  -->
           
< EllipseGeometry  x:Name ="MyAnimatedEllipseGeometry"
  Center
="20,20"  RadiusX ="15"  RadiusY ="15"   />
       
</ Path.Data >
</ Path >

        
     好了,有了上面的介绍之后,我们下面着手开发这个DEMO。

     首先我们建立一个silverlight application,并将其命名为:Animation_Sample
    
     然后我们要去找几张相册用的图片,将其放在项目中的resource文件夹下,并将其设置为资源,
如下图所示:
                

    然后在xaml中加入如下代码段作为Image元素对相应图片的引用:
    
< Grid  x:Name ="LayoutRoot"  Background ="White"  MouseEnter ="LayoutRoot_MouseEnter"
    MouseLeave
="LayoutRoot_MouseLeave" >   
    
< Image  x:Name ="image_one"  Source ="resource/img_one.jpg"  Height ="40"  Width ="400"  Canvas.Left ="30"
         Canvas.Top
="30"  Margin ="12,0,0,0" ></ Image >
    
< Image  x:Name ="image_two"  Source ="resource/img_two.jpg"  Height ="40"  Width ="400"  Canvas.Left ="30"
         Canvas.Top
="30"  Margin ="12,0,0,0" ></ Image >
    
< Image  x:Name ="img_three"  Source ="resource/img_three.jpg"  Height ="40"  Width ="400"  Canvas.Left ="30"
         Canvas.Top
="30"  Margin ="12,0,0,0" ></ Image >
    
< Image  x:Name ="img_four"  Source ="resource/img_four.jpg"  Height ="40"  Width ="400"  Canvas.Left ="30"
         Canvas.Top
="30"  Margin ="12,0,0,0" ></ Image >
    
< Image  x:Name ="img_five"  Source ="resource/img_five.jpg"  Height ="40"  Width ="400"  Canvas.Left ="30"
        Canvas.Top
="30"  Margin ="12,0,0,0" ></ Image >
</ Grid >


    然后在该xaml文件上击鼠标右键,选择"在 Expression Blend 中打开"菜单项,然后在打开的Blend 窗口中
按下图中所指示的方式来创建一个Storyboard,名为:image1Storyboard .



    接着拖动当前帧到2秒处,执行“record keyframe”操作:




    然后对左侧的图片进行"rotate transfer"和"scale transfer"操作,如下图:




      而其最终的值如下图所示:

      
  
  
     这里我们可以通过下图所示演示一下当前图片从0秒到2秒的运行情况:


  
  
     同理对其它图片进行相类似的操作后,就可以将当前文件进行保存,并单击F5进行试运行了。接着,我们还要
再切换回VS完成动画播放的工作。在本DEMO中,因为使用了鼠标移入移出方式来实现动画的播放任务。所以我们
要在相应的xaml.cs文件中加入storyboard的"Begin()"方法绑定如下:

private   void  LayoutRoot_MouseEnter( object  sender, MouseEventArgs e)
{
    image1Storyboard.Begin();
}

    
     这样就可以运行该DEMO了。
  
  
     到这里,我们只是实现了将图片从初始位置移动到指定位置。而没有实现reverse操作,即图片从分散展示状态
再回到实始状态
。但实现这个功能也非常简单,主要是用了一个小技巧:

     1.首先我们要对当前的storyboard执行复制操作,如下图:

     
  
     2. 然后在新生成的storyboard中修改其名称,并对其进行reverse操作,如下图:

     
  
  
     这样我们就得到了一个对展开的“逆操作”的storyboard.然后我们在xaml.cs中调用这个storyboard的
Begin()方法即可,如下:

private   void  LayoutRoot_MouseLeave( object  sender, MouseEventArgs e)
{
    image1Storyboard_Reverse.Begin();
}


     通过Blend工具,我们非常轻松的实现了展示效果,这远比在XAML中手写代码要来得“简单正确”。
  

     好了,今天的内容就到这里了。



本文转自 daizhenjun 51CTO博客,原文链接:http://blog.51cto.com/daizhj/87551,如需转载请自行联系原作者

相关文章
|
C# 前端开发
silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳。本章节的动画虽然简单,但是实现的效果可是一点也不打折。
1183 0
|
C#
silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发) 本教程基本涵盖了WPF和silverlight中的各种动画。先上张效果图。 声明下,这个做的不是让大家照搬的,只是让大家熟悉下动画效果,这个成品基本涵盖了sl里面所有的动画效果。
1391 0
|
C#
silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发) 有个问题想请教下大家,我仿了腾讯的SL版QQ,相似度95%以上。我想写成教程教大家怎么开发出来,会不会有版权什么问题的。
1134 0
|
前端开发 C#
silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发) 这章有点长,所以我分成了两章。这一章主要是准备工作,差不多算美工篇吧,这章基本不会介绍多少动画效果,主要讲的是blend中工具的使用,利用哪些工具做出哪些效果。
1235 0
|
前端开发 C#
silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发) 这篇介绍的是3D导航,点击图标,页面360°翻转的效果!有什么不足的欢迎大家指出来。 1.新建一个usercontrol,命名为menu. 2.按照下图设置一下属性。
1241 0
|
容器
Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)
原文:Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)   Silverlight的基础动画包括偏移、旋转、缩放、倾斜和翻转动画,这些基础动画毫无疑问是在Silverlight中使用得最多的动画效果,其使用也是非常简单的。
1011 0
|
容器 数据可视化 内存技术
Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)
原文:Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)   用户界面组件、图像元素和多媒体功能可以让我们的界面生动活泼,除此之外,Silverlight还具备动画功能,它可以让应用程序“动起来”。
814 0
Silverlight & Blend动画设计系列四:倾斜动画(SkewTransform)
原文:Silverlight & Blend动画设计系列四:倾斜动画(SkewTransform)   Silverlight中的倾斜变化动画(SkewTransform)能够实现对象元素的水平、垂直方向的倾斜变化动画效果。
839 0
|
容器
Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)
原文:Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)   正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Blend下能够设计出很多满意的动画作品,或许他具体是怎么实现的,通过什么方式实现的我们还是一无所知。
941 0
Silverlight & Blend动画设计系列七:模糊效果(BlurEffect)与阴影效果(DropShadowEffect)
原文:Silverlight & Blend动画设计系列七:模糊效果(BlurEffect)与阴影效果(DropShadowEffect)   模糊效果(BlurEffect)与阴影效果(DropShadowEffect)是两个非常实用和常用的两个特效,比如在开发相册中,可以对照片的缩略图添加模糊效果,在放大照片的过程中动态改变照片的大小和模糊的透明度来达到一个放大透明的效果。
1085 0

热门文章

最新文章