桌面下雪效果

一个简单的下雪效果

MainWindow:

1.主界面通过DispatcherTimer给Grid生成雪花

2.雪花飘落后再讲雪花从Grid容器中移除

 public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            Closing += (s, e) => ViewModelLocator.Cleanup();
            Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var timer = new DispatcherTimer
            {
                Interval = TimeSpan.FromMilliseconds(100)
            };
            timer.Tick += timer_Tick;
            timer.Start();
        }

        //添加雪花
        private void timer_Tick(object sender, EventArgs e)
        {
            LayoutRoot.Children.Add(CreateSnowFlower());
        }

        //生成雪花
        private static SnowFlower CreateSnowFlower()
        {
            var snowFlower = new SnowFlower();

            snowFlower.Complete += args =>
            {
                //将雪花从父容器中移除
                var flower = args as SnowFlower;
                if (flower == null) return;
                var parent = VisualTreeHelper.GetParent(flower);
                var panel = parent as Panel;
                if (panel != null && panel.Children.Contains(flower))
                {
                    panel.Children.Remove(flower);
                }
            };

            return snowFlower;
        }
    }

SnowFlower

1.雪花的飘落动画以及旋转动画

2.增加动画完成事件

3.随机的起点

4.随机的旋转速度以及下落速度

  /// <summary>
    /// 雪花
    /// </summary>
    public class SnowFlower : Image
    {

        #region 字段

        //完全随机数生成器
        private readonly Random _random = RandomHelper.GetRandom();

        #endregion

        #region 属性

        /// <summary>
        /// 下落速度
        /// </summary>
        public int GravitySpeed
        {
            get { return _random.Next(5, 10); }
        }

        /// <summary>
        /// 旋转速度
        /// </summary>
        public int AngleSpeed
        {
            get { return _random.Next(1, 5); }
        }

        /// <summary>
        /// 起始的X坐标
        /// </summary>
        public int StartX
        {
            get
            {
                return _random.Next(0, (int)SystemParameters.PrimaryScreenWidth);
            }
        }

        #endregion

        public SnowFlower()
        {
            Opacity = GetOpacity();
            Source = GetSource();
            Height = GetSize();
            Width = Height;
            RenderTransformOrigin = new Point(0.5, 0.5);
            Margin = new Thickness(StartX, 0, 0, 0);
            HorizontalAlignment = HorizontalAlignment.Left;
            VerticalAlignment = VerticalAlignment.Top;
            RenderTransform = GetRenderTransform();
            Loaded += SnowFlower_Loaded;
        }

        #region 动画

        private void SnowFlower_Loaded(object sender, RoutedEventArgs e)
        {
            GetFallingStoryborad().Begin();
        }

        //获取变换的信息
        private static TransformGroup GetRenderTransform()
        {
            var result = new TransformGroup();
            result.Children.Add(new RotateTransform());
            result.Children.Add(new TranslateTransform());
            return result;
        }

        //获取飘落动画故事版
        private Storyboard GetFallingStoryborad()
        {
            var result = new Storyboard();

            //加入旋转动画
            result.Children.Add(GetAngleAnimation());

            //加入掉落动画
            var fallingAnimation = GetFallingAnimation();
            result.Duration = fallingAnimation.Duration;
            //当掉落完成之后触发完成事件
            result.Completed += (sender, args) => RaiseComplete();
            result.Children.Add(fallingAnimation);

            return result;
        }

        //属性链
        private readonly object[] _propertyChain = {
                RenderTransformProperty,
                TransformGroup.ChildrenProperty,
                RotateTransform.AngleProperty,
                TranslateTransform.YProperty
            };

        //获取旋转动画
        private DoubleAnimation GetAngleAnimation()
        {
            var da = new DoubleAnimation
            {
                From = 0,
                To = 360,
                Duration = TimeSpan.FromSeconds(AngleSpeed),
                RepeatBehavior = RepeatBehavior.Forever
            };
            //Storyboard.SetTargetProperty(da, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)"));
            Storyboard.SetTargetProperty(da, new PropertyPath("(0).(1)[0].(2)", _propertyChain));
            Storyboard.SetTarget(da, this);
            return da;
        }

        //获取飘落动画
        private DoubleAnimation GetFallingAnimation()
        {
            var da = new DoubleAnimation
            {
                From = 0,
                To = SystemParameters.PrimaryScreenHeight,
                Duration = TimeSpan.FromSeconds(GravitySpeed)
            };

            Storyboard.SetTargetProperty(da, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)"));
            Storyboard.SetTarget(da, this);
            return da;
        }

        #endregion

        //获取初始的透明度
        private static double GetOpacity()
        {
            var result = (double)new Random().Next(1, 5);
            result = result / 10;
            return result;
        }

        //获取图像源
        private static BitmapImage GetSource()
        {
            var result = new BitmapImage();
            result.BeginInit();
            result.UriSource = new Uri("/SnowEffect;component/Resource/SnowFlower.png", UriKind.RelativeOrAbsolute);
            result.EndInit();
            return result;
        }

        //获取尺寸
        private static double GetSize()
        {
            var result = (double)new Random().Next(20, 50);
            return result;
        }

        #region 完成事件

        /// <summary>
        /// 完成处理委托
        /// </summary>
        /// <param name="sender"></param>
        public delegate void CompleteHandler(object sender);

        /// <summary>
        /// 完成事件
        /// </summary>
        public event CompleteHandler Complete;

        /// <summary>
        /// 完成事件触发时的操作
        /// </summary>
        protected virtual void OnComplete()
        {
            if (Complete != null)
            {
                Complete(this);
            }
        }

        /// <summary>
        /// 引发完成事件
        /// </summary>
        public void RaiseComplete()
        {
            OnComplete();
        }

        #endregion
    }

源码

时间: 2024-08-06 21:59:03

桌面下雪效果的相关文章

WPF桌面下雪效果

寄存在canvas面板,目前缺点就是开始的时候效果有点别扭. 直接贴代码: 1 void StartSnowing(Canvas panel) 2 { 3 Random random = new Random(); 4 Task.Factory.StartNew(new Action(() => 5 { 6 for (int j = 0; j < 10; j++) 7 { 8 Thread.Sleep(j * 100); 9 Dispatcher.Invoke(new Action(() =&

桌面下雪效果(二)

增加系统托盘图标,并取消任务栏图标 1.取消任务栏图标 启动窗口设置ShowInTaskbar="False" <Window x:Class="SnowEffect.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&q

关情纸尾-----Quartz2D定时器CADisplayLink下雪效果

定时器CADisplayLink下雪效果 1.定时器雪花整体思路: 先在控制器View面绘制一个雪花. 在View加载完毕后,添加一个定时器. 在定时器方法当中调用得绘方法. 在绘图方法当不段的去修改雪花的Y值. 当雪花的Y值超过屏幕的高度时,让雪花的Y值重新设为0.从最顶部开始. 2.添加定时器实现方案 第一种采用NSTime 第二种采用CADisplayLink 最终采用CADisplayLink方案. 2.1为什么采用CADisplayLink方案不用NSTime? 首先要了解setNee

再次推荐一款逼真的HTML5下雪效果

再次推荐一款逼真的下雪效果 效果图: 效果描述:之前推荐过一款下雪的jQuery插件之前的那款下降速度比较缓慢,今天推荐的这个下降速度比较快,大雪哇 使用方法:1.将index.html中的样式复制到你的样式表中2.将body中的代码部分拷贝到你需要的地方(注意保持图片.js文件路径的正确性) 查看效果:http://hovertree.com/texiao/jquery/36/ 下载地址 效果二 效果3 更多特效:http://www.cnblogs.com/roucheng/p/texiao

Win桌面三维效果

进入Windows 7旗舰版的桌面后,按住组合键Win + Ctrl + Tab即可将三维效果定在某个位置. 现在提供一种建立快捷方式的办法: 在桌面空白处右击鼠标-新建-快捷方式,在弹出的对话框中输入C:\Windows\System32\rundll32.exe DwmApi #105,“C”为Windows 7所在分区-然后单击下一步完成,就在桌面上创建了一个开启立体窗口转换的快捷方式. Win桌面三维效果

Delphi以GDI+制作桌面歌词效果

在Windows XP下效果图: 在Windows 7下有焦点时效果图: 在Windows 7下无焦点时效果图: 在Windows 7下右键菜单效果图: 很多音频播放软件都带有桌面歌词效果,在桌面上显示歌词字幕,可以设置是否置顶桌面,是否背景穿透等等.要实现这样的效果方法有很多种,利用GDI+的特性来实现桌面歌词效果,可以达到歌词字幕的平滑柔和.在参考了CodeProject的一篇文章,文章标题<To Create A COOL Desktop Lyrics Demo >链接地址:http:/

强大的CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非css3和canvas(还有gif),对比下css3和canvas的优缺点: 动画自由度:canvas胜: 复杂度:canvas胜: 兼容性:canvas胜: 性能:css3胜(requestAnimationFrame和硬件加速). 由于对于性能有一定的要求,canvas对比css3会有更多的计算

CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非css3和canvas(还有gif),对比下css3和canvas的优缺点: 动画自由度:canvas胜: 复杂度:canvas胜: 兼容性:canvas胜: 性能:css3胜(requestAnimationFrame和硬件加速). 由于对于性能有一定的要求,canvas对比css3会有更多的计算

今年最后一场“雪”:下雪效果讲解

每年年底,特别是在圣诞节,各大网站都玩起了“下雪”.在这弄一个,纪念:今年的结束,新年的开始.也祝福大家在新的一年里越来越好. 先看看效果(如果乱码或者不能查看 复制下面的代码保存在本地查看) <!doctype html> <html> <head> <meta charset="UTF-8"> <title>下雪</title> <style type="text/css"> *