Silverlight & Blend动画设计系列十三:三角函数(Trigonometry)动画之飘落的雪花(Falling Snow)
平时我们所看到的雪花(Falling Snow)飘飘的效果实际上也是一个动画,是由许多的动 画对象共同完成的一个界面效果,
Silverlight & Blend动画设计系列十三
。对于不同大小的雪片可以通过缩放变换(ScaleTransform. )功能特性确定,雪片飘落是存在于一个空间之中,通过不同的透明度值可使雪花看上去具 有一定的空间视觉,雪花的飘落过程是由三角函数的原理实现的左右滑落效果,并可根据随 机生成数字作为雪花飘落的速度。雪花UserControl
通过路径(Path)可绘制雪花界面,为此只需要提供一个根据不同参数构造不同的雪花界 面效果的接口,既构造方法:
//根据不同的参数构造雪花对象
public Snowflake(double Left, double Top, double Opacity)
{
InitializeComponent();
//随机速度
Speed = Rand.Next(5);
if (Speed < 1)
{
Speed = 1;
}
//随机位置、弧度、角度
DriftPosition = Left;
DriftRange = Rand.Next(50);
DriftAngle = Rand.Next(270);
Spin = Rand.Next(5);
ScaleFlake.ScaleX = ScaleFlake.ScaleY = Rand.Next(25, 100) / 100.0;
Canvas.SetLeft(this, Left);
Canvas.SetTop(this, Top);
this.Opacity = Opacity;
Position.X = Left;
Position.Y = Top;
}
出了根据不同参数生成雪花对象外,还需提供一个动态改变雪花位置的接口,也就是动态 改变雪花的X,Y的坐标值,
电脑资料
《Silverlight & Blend动画设计系列十三》(https://www.unjs.com)。//根据三角函数计算雪片下落过程(Y坐标)中的左右(X方向)浮动效果
public void MoveFlake()
{
Position.Y += Speed;
Position.X = DriftPosition + Math.Cos(DriftAngle) * DriftRange;
RotateFlake.Angle += Spin;
if (Position.Y > AppHeight)
{
Position.Y = -this.Height;
}
Canvas.SetLeft(this, Position.X);
Canvas.SetTop(this, Position.Y);
DriftAngle += DriftSpeed;
}
在主程序中需要定义一个动画,用于控制雪花下落和角度旋转:
通过主程序动态的随机构造雪花对象并添加到界面中,然后统一启动动画就实现了飘落的 雪花效果,其完整的主控程序如下代码块:
public partial class MainPage : UserControL
{
private List
private List
private List
private int MaxFlakes = 250;
private Random Rand = new Random();
public MainPage()
{
InitializeComponent();
//雪花集合--初始化250个雪花对象并同事进行动画处理
Flake = new List
//雪花坐标集合
XYStart = new List
//不透明度集合
pacityValue = new List
for (int i = 0; i < MaxFlakes; i++)
{
//不同的起止坐标
Point newPoint = new Point(Rand.Next((int) LayoutRoot.Width), Rand.Next((int)LayoutRoot.Height));
XYStart.Add(newPoint);
//不同透明度值
OpacityValue.Add(Rand.NextDouble());
}
InitFlakes();
Snowfall.Completed += new EventHandler (Snowfall_Completed);
Snowfall.Begin();
}
private void InitFlakes()
{
//循环生成雪花冰添加到界面
for (int i = 0; i < MaxFlakes; i++)
{
Snowflake flake = new Snowflake(XYStart[i].X, XYStart[i].Y, OpacityValue[i]);
Flake.Add(flake);
flake.AppHeight = LayoutRoot.Height;
LayoutRoot.Children.Add(flake);
}
}
//动画完成后继续开始动画的执行
private void Snowfall_Completed(object sender, EventArgs e)
{
foreach (Snowflake flake in Flake)
{
flake.MoveFlake();
}
Snowfall.Begin();
}
}
源码: http://files.cnblogs.com/beniao/Siverlight/SnowflakesCompleted.rar