时光雕像

Experience is the father of wisdom and memory the mother.

导航

Silverlight2 beta2 Document中Animation一节的翻译(2)

实现一个UIElement在视图中的淡入淡出效果

这个例子演示了在SilverLight中,通过对矩形的属性施加动画,来达到矩形在视图中淡入淡出的效果。它使用了DoubleAnimation,一种能产生Double类型值的动画,通过对矩形的不透明度(Opacity)属性的调整,我们就能实现矩形的淡入淡出效果。
例子的第一部分是创建矩形元素并且把它展示在StackPanel中

XAML代码:

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

 

为了创建一个动画并把它施加到矩形的OPacity属性上,需要以下几个步骤:
     创建一个DoubleAnimation
     创建一个StoryBoard
     开始StoryBoard来响应事件

这些步骤将在下文中详细论述

 
创建一个DoubleAnimation
由于Opacity属性是Double型的,所以我们需要一个能产生Double类型值的动画。DoubleAnimation就是这种类型的动画。它能创建两个double值之间的过渡。你可以通过设置From属性来指定DoubleAnimation的起始值,通过设置Top属性指定它的结束值
1.Opacity的值为1.0时,对象将处于完全可见的状态,相反,当它的值为0.0时,对象将处于完全不可见状态。为了实现不透明度从1.0过渡到0.0,你需要设置它的From属性值为1.0To属性值为0.0


<DoubleAnimation From="1.0" To="0.0"/>


2. 为创建的Aniamtion指定一个Duration值。这个Duration值指定了一个动画从起始值到目标值变化需要的时间。在下面的例子中,动画的Duration值被设定为1秒。

<DoubleAnimation From="1.0" To="0.0" Duration="0:0:1" />

3.前面已经创建了一个使不透明属性从1.0过渡到0.0的Animation,使得目标元素从完全可见逐渐变成完全不可见,为了使这个元素在消失后重新显示在视图中,我们把AutoReverse属性设定为True,为了让动画效果不确定地重复,把Repeat属性设定为值Forever。

<DoubleAnimation From="1.0" To="0.0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever"/>

创建故事板(StoryBoard)
为了给一个对象附加上动画,你需要创建一个故事板,用TargeName和TargetProperty两个附加属性(attached Property)来指定对哪一个对象及对象上的哪一个属性施加动画。
1.创建故事板,并将Animation添加为故事板的孩子。

<Storyboard>
  
<DoubleAnimation From="1.0" To="0.0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>

虽然在本例中只添加了一个动画。并不表示故事板下只能由一个动画,我们可以在下面添加多个动画。

2.这个故事板需要知道对哪一个对象施加了动画。使用TargetName附加属性(attached Property)来制定对哪一个对象施加动画。在下面的代码中,我们将DoubleAnimation的TargetName属性值设定为myAnimatedRectangle,这个值就是我们要施加动画的目标对象的名字。

<Storyboard>
  
<DoubleAnimation
    
Storyboard.TargetName="MyAnimatedRectangle"
    From
="1.0" To="0.0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>

3.用TargetProperty这个附加属性(attached property)来指定施加动画的属性,在下面的代码中我们将它的值设定为Rectangle的Opacity属性

<Storyboard>
  
<DoubleAnimation
   
Storyboard.TargetName="MyAnimatedRectangle" 
    Storyboard.TargetProperty
="Opacity"
    From
="1.0" To="0.0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>

将动画和事件关联
目前为止,你已经制定了动画的目标对象和目标属性以及动画的表现方式;你还需要指定动画开始的时机。你可以用事件来完成这个任务。
1.将StoryBoard做成一个资源:将StoryBoard定义在Resource标签下,这样你就可以很容易地从代码中访问到这个StoryBoard并且可以与它进行交互。比如,开始,结束,停止,继续这个故事板。下面的标记语言中把StoryBoard声明在StackPanel对象的一个Resource块中。注意,其实你可以把StoryBoard声明在任何一个Resource块中,前提条件是这个资源块和需要施加动画的目标对象是在一个范围中。

    <StackPanel>
        
<StackPanel.Resources>
            
<!-- Animates the rectangle's opacity. -->
            
<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>
        
<Rectangle
        
x:Name="MyAnimatedRectangle"
        Width
="100" Height="100" Fill="Blue" />
    
</StackPanel>

2.在元素上附加一个事件:我们有很事件可以用来开始一个动画,包括鼠标相关的事件,例如MouseLeftButtonDown,它的触发时机是当用户电击一个对象的时候,再比如Loaded事件,它的触发时机是对象初次被加载的时候。在本例中,我们使用MouseLeftButtonDown来启动故事板,当用户点击矩形的时候,这个事件被触发。

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

3.在事件处理函数中控制动画:StoryBoard暴露了几个方法是的你可以重放故事板中的动画,这些方法包括Begin,stop,pause,Resume。在下面的例子中,当用户点击这个矩形,在MouseLeftButtonDown的事件处理函数中,我们将使用Begin这个方法来开始动画。

 // When the user clicks the Rectangle, the animation
        // begins.
        public void Mouse_Clicked(object sender, MouseEventArgs e)
        {
            myStoryboard.Begin();
        }

完整代码
XAML

 <StackPanel>
        
<StackPanel.Resources>
            
<!-- Animates the rectangle's opacity. -->
            
<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>

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

    
</StackPanel>

C#代码

  // When the user clicks the Rectangle, the animation
        // begins.
        public void Mouse_Clicked(object sender, MouseEventArgs e)
        {
            myStoryboard.Begin();
        }

 

posted on 2008-06-14 19:55  时光雕像  阅读(385)  评论(0编辑  收藏  举报