posts - 283,  comments - 6275,  trackbacks - 107
     在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中手写代码要来得“简单正确”。
 
     好了,今天的内容就到这里了。
 
     源码下载链接,请点击这里:)


posted on 2008-07-14 09:30 代震军 阅读(8532) 评论(17) 编辑 收藏

FeedBack:
2008-07-14 10:02 | 雄哥      
好象加载需要挺长时间!
 回复 引用 查看   
#2楼[楼主]
2008-07-14 10:10 | 代震军      
@雄哥
主要是图片太大,每个都几兆,所以下载会慢一些:)

 回复 引用 查看   
2008-07-14 10:16 | Yes!加菲猫      
楼主同学,我看不到你的Silverlight效果,你那个是什么版本啊
 回复 引用 查看   
2008-07-14 10:21 | Yes!加菲猫      
查看此文源文件得到此行链接地址:http://silverlight.services.live.com/invoke/72193/animation_sample/iframe.html

输入,看到效果图~汗,5个小图片怎么会加载这么久。。。silverlight怎么这样啊。。。

 回复 引用 查看   
#5楼[楼主]
2008-07-14 10:22 | 代震军      
@Yes!加菲猫
silverlight 2.0 beta2

 回复 引用 查看   
#6楼[楼主]
2008-07-14 10:23 | 代震军      
@Yes!加菲猫
5个图片一点都不小,因为页面关系,才整成这么小的,每个图片至少2m呢,呵呵:)

 回复 引用 查看   
2008-07-14 11:21 | scoxu[未注册用户]
那可以把图片先处理一下嘛
 回复 引用   
2008-07-14 11:44 | 永不言弃      
不错 佩服
 回复 引用 查看   
#9楼[楼主]
2008-07-14 12:31 | 代震军      
@scoxu
主要还是时间问题 ,另外原本设想再加一个点击图片放大的功能,这样就能看出效果了。

 回复 引用 查看   
#10楼[楼主]
2008-07-14 12:31 | 代震军      
@永不言弃
呵呵,过奖了:)

 回复 引用 查看   
2008-07-14 15:28 | icewindq[未注册用户]
不会吧,老大!
为了看你的运行效果,我足足等了二十几分钟!!

 回复 引用   
#12楼[楼主]
2008-07-14 15:38 | 代震军      
@icewindq
不会这么长时间的,我在传到微软上下载到本地只用了半分钟就可以演示了,我想大家看时顶多一分钟应该就可以了

 回复 引用 查看   
2008-07-14 17:15 | 张晓飞2008      
群主的代码我下载过两个都不能直接运行。希望群主上传的时候能确保它能运行
 回复 引用 查看   
#14楼[楼主]
2008-07-14 17:22 | 代震军      
@张晓飞2008
主要是XAP文件和里面的DLL太大,而我的空间容量有限,故去掉了,相信大家只要看了代码就会理解了。

 回复 引用 查看   
2008-07-29 23:22 | 郭杰[未注册用户]
其实那段动画根本就没做好!
动画应该触发两个StoryBoard(一个扩展,一个收缩)。
没做好的地方是:鼠标放到照片上即开始扩张,但是如果在照片扩展到一半时(还没有完全展开),就把鼠标移出,那么照片不是从当前的位置收缩,而是直接触发收缩的那段StoryBoard,就是说从照片全部展开的位置开始收缩

 回复 引用   
#16楼[楼主]
2008-07-30 08:55 | 代震军      
@郭杰
你所说的这个问题我是知道的,但因为这是个DEMO,而不是一个产品,而且这只是为了介绍并说明一些关于StoryBoard的内容,所以没有尽力完善。你所说的这个问题其实解决起来也不太难

 回复 引用 查看   
2011-03-14 15:33 | D调の幸福      
蛮好的
 回复 引用 查看   
昵称:代震军
园龄:5年11个月
荣誉:推荐博客
粉丝:492
关注:3

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

搜索

 
 

常用链接

随笔分类(366)

随笔档案(283)

文章分类(8)

文章档案(31)

相册

JavaScript

LINQ

silverlight

UML,OO

WebBlogger

负载开源项目

  • Discuz!NT
  • LLServer
  • TokyoTyrantClient
  • WebCam

个人简历

漫画

其它

企业级架构

网站案例研究

积分与排名

  • 积分 - 1217876
  • 排名 - 26

最新评论

阅读排行榜

评论排行榜

推荐排行榜