读书人

windows phone:卡通(二)

发布时间: 2013-03-26 09:54:34 作者: rapoo

windows phone:动画(二)

Silverlight动画目标

Silverlight动画都是基于时间的,你只需指定特定时间段内需要发生的改变,Silverlight的动画类会自动处理好剩下的工作。

Silverlight的动画的运行原理是改变特定对象的特定属性,该属性(即动画目标)必须是依赖属性。

Silverlight动画可用于double、Color、Point和Object类型,下面是相应的动画类:

Object

DependencyObject(抽象)

Timeline(抽象)

DoubleAnimation

DoubleAnimationUsingKeyFrames

ColorAnimation

ColorAnimationUsingKeyFrames

PointAnimation

PointAnimationUsingKeyFrames

ObjectAnimationUsingKeyFrames

Storyboard -- 故事板

下面是一个DoubleAnimation示例:

xaml文件片段如下所示:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<Button Name="btn1"

Content="Button No. 1"
Grid.Row="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RenderTransformOrigin="0.5 0.5"
Click="OnButtonClick">
<Button.RenderTransform>
<RotateTransform x:Name="rotate1" />
</Button.RenderTransform>
</Button>

<Button Name="btn2"

Content="Button No. 2"
Grid.Row="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RenderTransformOrigin="0.5 0.5"
Click="OnButtonClick">
<Button.RenderTransform>
<RotateTransform x:Name="rotate2" />
</Button.RenderTransform>
</Button>

<Button Name="btn3"

Content="Button No. 3"
Grid.Row="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RenderTransformOrigin="0.5 0.5"
Click="OnButtonClick">
<Button.RenderTransform>
<RotateTransform x:Name="rotate3" />
</Button.RenderTransform>
</Button>
</Grid>
</Grid>

代码文件片段如下:

public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}

void OnButtonClick(object sender, RoutedEventArgs args)
{
Button btn = sender as Button;
RotateTransform rotateTransform = btn.RenderTransform as RotateTransform;

// 定义和生成一个动画

DoubleAnimation anima = new DoubleAnimation();
anima.From = 0;
anima.To = 360;
anima.Duration = new Duration(TimeSpan.FromSeconds(0.5)); //设置动画耗时,这里为0.5秒

// 设置附加属性

Storyboard.SetTarget(anima, rotateTransform); //使动画与特定对象关联
Storyboard.SetTargetProperty(anima, new PropertyPath(RotateTransform.AngleProperty)); //使动画与特定属性关联

// 生成storyboard,把动画加进去并启动

Storyboard storyboard = new Storyboard();
storyboard.Children.Add(anima);
storyboard.Begin();
}
}

运行程序后,被单击的按钮就会在0.5秒旋转一周。

当然,你也可以将动画定义在xaml文件中,如将上面例子作修改,在上面的xaml文件中附加下面的定义:

<phone:PhoneApplicationPage.Resources>
<Storyboard x:Name="storyboard1">
<DoubleAnimation Storyboard.TargetName="btn1" //注意它与下面第三个的目标对象的不同之处
Storyboard.TargetProperty="(Button.RenderTransform).(RotateTransform.Angle)" //注意它与下面第二个目标对象属性的不同写法

From="0" To="360" Duration="0:0:0.5" /> //Duration的三个数字分别表示 : 小时、分钟和秒,当然也可以在小时前增加天数等其他时间段
</Storyboard>

<Storyboard x:Name="storyboard2">
<DoubleAnimation Storyboard.TargetName="btn2"
Storyboard.TargetProperty="(Button.RenderTransform).Angle" //这个是简化语法

From="0" To="360" Duration="0:0:0.5" />
</Storyboard>

<Storyboard x:Name="storyboard3">
<DoubleAnimation Storyboard.TargetName="rotate3"
Storyboard.TargetProperty="Angle"
From="0" To="360" Duration="0:0:0.5" />
</Storyboard>
</phone:PhoneApplicationPage.Resources>

修改代码文件片段如下:

void OnButtonClick(object sender, RoutedEventArgs args)
{
if (sender == btn1)

{
storyboard1.Begin();

}else if (sender == btn2)
{
storyboard2.Begin();
}else if (sender == btn3)

{
storyboard3.Begin();

}
}

一些动画属性

如果动画类定义了Duration属性,如

anima.Duration = new Duration(TimeSpan.FromSeconds(0.5));

但你又为storyboard设置了更小的Duration值,如

storyboard.Duration = new Duration(TimeSpan.FromSeconds(0.25));

这将导致动画在0.25秒时被截断。默认情况下,storyboard的持续时间其持续时间最长的子元素的时限。

如果想让动画在1秒后启动,可这样设置

anima.BeginTime = TimeSpan.FromSeconds(1);

如果想让动画值From到To逆转,可这样设置

anima.AutoReverse = true; //这样值先从From到To走一遍后,再从To到From走一遍

如果想让动画重复运行,可这样设置

anima.RepeatBehavior = new RepeatBehavior(3); // 这里的3指的是一共执行的次数,如你将该值设置为1则跟不设置该属性时是一样的

读书人网 >windows

热点推荐