在 Silverlight 中,动画可以通过添加移动和交互性来增强图形的创建效果,当然这也是本着Silverlight的设计的初衷而来的.动画本身就是快速播放一系列图像. Silverlight 中,通过对对象的个别属性应用动画,可以对对象进行动画处理. 例如上例中右边对图片Image渐变属性Opacity简单动画效果. 来快速实现一下:
<1>:创建StoryBorad:
<Grid x:Name="LayoutRoot" Background="White">
<Grid.Resources>
<Storyboard x:Name="myfirststory" BeginTime="0:0:2" >
<!--对左边图片透明度进行缩放-->
<DoubleAnimation From="1.0" To="0" Storyboard.TargetName="leilei" Storyboard.TargetProperty="Opacity" x:Name="firtaum"
Duration="0:0:4" AutoReverse="True" RepeatBehavior="Forever" >
</DoubleAnimation>
</Storyboard>
</Grid.Resources>
</Grid>
为什么要用DoubleAnimation ? 在Silverlight中动画对属性值的动画控制分为几个类型. 其中对值类型为Double属性进行简单动画处理需要DoubleAnimation 例如图片Image透明度属性Opacity.
From="1.0" To="0"
Storyboard.TargetName="leilei" Storyboard.TargetProperty="Opacity"
利用StroyBorad.TargetName属性绑定具体动画控制对象. TargetProperty则绑定控制对象具体控制属性.
Duration="0:0:4" AutoReverse="True" RepeatBehavior="Forever"
Duration属性获取或设置此时间线播放的时间长度,而不是计数重复, 时间长度格式同 "小时:分钟:秒数", 如上Duration="0:0:4"动画时间为4秒钟时间.
AutoReverse属性指示时间线在完成向前迭代后是否按相反的顺序播放, 简单的说就是控制动画是否循环播放.
如上既是定义一个简单的DoubleAnimation 控制Double值StoryBoard. 在StoryBorad可以控制UIElelment属性还有ColorAnimation和PointAnimation. 四者之间关系如下图:
<a target="_blank" href="http://blog.51cto.com/attachment/201201/161113720.png"></a>
<2>StoryBorad动起来.
创建完成StoryBorad动画后 可以通过事件进行关联.让动画动起来. Button按钮后台事件中:
myfirststory.Begin();//启动动画
相关关于StoryBorad暂停,停止,继续播放调用分别对应如下:
myfirststory.Pause();//暂停
myfirststory.Stop();//停止
processborad.Resume();//动画继续
这样就能简单控制动画整个流程.
<3>StoryBorad控制动画运动时间
在控制StoryBorad控制时间前先看一个关于一个简单DoubleAnimation 控制三条Line实例:
<a target="_blank" href="http://blog.51cto.com/attachment/201201/161118468.jpg"></a>
页面创建不同颜色的线: 红,蓝,黑 三条. 利用DoubleAnmation控制它与Canvas.Top距离来实现动态三个不同方位动态移动.实现页面Xaml:
<Border BorderThickness="1" BorderBrush="Red">
<Canvas VerticalAlignment="Center" HorizontalAlignment="Center">
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded" >
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard x:Name="animation" Storyboard.TargetName="Horizontal1" Storyboard.TargetProperty="(Canvas.Left)" RepeatBehavior="Forever">
<DoubleAnimation To="100" Duration="0:0:10" />
<DoubleAnimation Storyboard.TargetName="Horizontal2" Storyboard.TargetProperty="(Canvas.Top)" To="99" Duration="0:0:10" />
<DoubleAnimation Storyboard.TargetName="Vertical" To="299" Duration="0:0:10" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Canvas.Triggers>
<!--定义三条线来控制-->
<Line x:Name="Horizontal1" X1="1" Y1="1" X2="300" Y2="1" Stroke="#000000" StrokeThickness="1"/>
<Line x:Name="Horizontal2" X1="1" Y1="1" X2="300" Y2="1" Stroke="#CC0000" StrokeThickness="1"/>
<Line x:Name="Vertical" X1="1" Y1="1" X2="1" Y2="100" Stroke="#0000CC" StrokeThickness="1"/>
</Canvas>
</Border>
</Grid>
如果我现在改变需求,定义三条线运动时间顺序, 红线先走, 黑线次之, 蓝线最后. 如何定义? 这就涉及到动画运动时间定义.这就让我想起了TimeLine中BegainTime属性来控制.而StoryBorad中三个常用动画控制Double/Color/Point都继承于TimeLine, 这就为动画运动时间控制创造可能.可以设置:
<Storyboard BeginTime="0:0:2"></Storyboard>
设置StoryBorad是对整个动画开始时间进行延缓 如上延缓为2秒钟. 值得注意的是动画控制时间格式为"0:0:2", 对应为"小时:分钟:秒数". 现在控制三条线运动顺序.为了明显看出效果设置间隔事件为3秒. 设置如下:
<DoubleAnimation To="100" Duration="0:0:10" BeginTime="0:0:3" />
<DoubleAnimation Storyboard.TargetName="Horizontal2" Storyboard.TargetProperty="(Canvas.Top)" Duration="0:0:10" To="99" BeginTime="0:0:3" />
<DoubleAnimation Storyboard.TargetName="Vertical" To="299" Duration="0:0:10" BeginTime="0:0:3" />
运行效果:
红线在程序开始后第5秒开始向下滚动. 其中StoryBorad包含两秒延缓时间
蓝线在第8秒开始向右滚动.
红线在第11秒开始向左滚动.
<4>StoryBorad显示方位控制[silverlight 3D效果]
有时需要对动画页面中对应的UIElement方位进行一定变动. 其实这就涉及到Silverlight 支持的3D效果.3D 支持已经Silverlight 4中得到极大改观. 目前也出了不少基于Silverlight 3D 一些XGA LineGame等等. 利用Silverlight 对一个Image实现3D控制:
<a target="_blank" href="http://blog.51cto.com/attachment/201201/161124773.jpg"></a>
页面XAML:
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="198*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="498*" />
</Grid.ColumnDefinitions>
<Border Grid.Row="0" Grid.Column="0" BorderThickness="1" BorderBrush="Red" VerticalAlignment="Stretch" HorizontalAlignment="Left">
<Image Source="/TestSilverlightStoryBoradDemo;component/Image/leiqueen.jpg" Width="500" Height="400" >
<Image.Projection>
<PlaneProjection x:Name="imgplane" RotationX="-45" RotationY="45" RotationZ="45" ></PlaneProjection>
</Image.Projection>
</Image>
</Border>
<Canvas Grid.Row="0" Grid.Column="1">
<TextBlock Text="Relation-Z:" Canvas.Top="25" Canvas.Left="20" />
<Slider Width="302" x:Name="firstlid" Canvas.Left="85" Maximum="1000" Minimum="-1000" Canvas.Top="25" ValueChanged="firstlid_ValueChanged" />
<TextBlock x:Name="firtlibtxt" Canvas.Top="25" Canvas.Left="425"></TextBlock>
<TextBlock Text="Relation-X:" Canvas.Top="70" Canvas.Left="20"></TextBlock>
<Slider Width="302" Canvas.Left="85" x:Name="secondlib" Maximum="1000" Minimum="-1000" Canvas.Top="70" ValueChanged="secondlib_ValueChanged" />
<TextBlock x:Name="secondlibtxt" Canvas.Top="75" Canvas.Left="425"></TextBlock>
<TextBlock Text="Relation-Y:" Canvas.Top="110" Canvas.Left="20"></TextBlock>
<Slider Width="302" Canvas.Left="85" x:Name="threelib" Maximum="1000" Minimum="-1000" Canvas.Top="110" ValueChanged="threelib_ValueChanged" />
<TextBlock x:Name="threelibtxt" Canvas.Top="110" Canvas.Left="425"></TextBlock>
<TextBlock Text="CenterOfRotation-X:" Canvas.Top="140" Canvas.Left="0" Visibility="Collapsed"></TextBlock>
<Slider Width="302" x:Name="centerRotx" Maximum="1000" Minimum="-1000" Visibility="Collapsed" Canvas.Top="140" Canvas.Left="110" ValueChanged="centerRotx_ValueChanged" />
<TextBlock x:Name="centerRotxtxt" Canvas.Top="140" Canvas.Left="425" Visibility="Collapsed"></TextBlock>
</Canvas>
</Grid>
<a target="_blank" href="http://blog.51cto.com/attachment/201201/161133833.jpg"></a>
UIElement中LocalOffSet- X/Y/Z属性获取或设置沿对象平面的 X /Y/Z轴平移对象的距离, 【注意:对象是平面, 位移方式: 平移】
Globalset-X/Y/Z属性获取或设置沿屏幕的 X/Y/Z 轴平移对象的距离 【注意: 针对的是屏幕的平移】
CenterRelation-X/Y/Z属性获取或设置所旋转对象的旋转中心 X 坐标 【针对的是旋转中心控制.】
本篇都是一些非常基础的涉及到Silverlight StoryBorad应用. 主要针对初学者 高手飘过.如有任何疑问 请在留言中回复我.
Silverlight StoryBorad Dome源码下载
本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/764822