基于帧的动画

基于帧的动画是什么呢!

它是要为静态的CompositionTarger.Rendering事件关联事件处理程序,一旦关联 这个处理程序,WPF就开始不断地调用这个事件处理程序,WPF将每秒调用60次。当动画 结束后,分离事件处理程序。首先要创建实体,创建一个椭圆设置椭圆颜色设置椭圆的宽设置椭圆的高设置椭圆位置设置椭圆位置将创建出来的椭圆加入到canvas面板中实例化EllipseInfo然后将创建好的EllipseInfo加入到listEllipse集合中。

                

      后台代码展示:

        public class EllipseInfo

        {

            public Ellipse Ellipse { get; set; }

            public double VelocityY { get; set; }

 

            public EllipseInfo(Ellipse _ellipse,double _velocityY)

            {

                Ellipse = _ellipse;

                VelocityY = _velocityY;

            }

        }

        private List<EllipseInfo> listEllipse = new List<EllipseInfo>();         

private double acclerationY = 0.1;

        private int minStartingSpeed = 1;

        private int maxStartingSpeed = 50;        

private double speedRatio = 0.1;

        private int minEllipses = 2500;          

private int maxEllipses = 2500;         

private int ellipseRadius = 10;         

private bool rendering = false;

 

        public void CompositionTarget_Rendering(object sender, EventArgs e)

        {

            if (listEllipse.Count == 0)

            {

                int halfCanvasWidth = (int)canvas.ActualWidth / 2;

                Random random = new Random();

                int ellipseCount = random.Next(minEllipses, maxEllipses + 1);

                for (int i = 0; i < ellipseCount; i++)

                {

                    Ellipse ellipse = new Ellipse();              

                    ellipse.Fill = new SolidColorBrush(Colors.LimeGreen);

                    ellipse.Width = ellipseRadius;

                    ellipse.Height = ellipseRadius;

                    Canvas.SetLeft(ellipse, halfCanvasWidth + random.Next(-halfCanvasWidth, halfCanvasWidth));

                    Canvas.SetTop(ellipse, 0);

                    canvas.Children.Add(ellipse);

                    EllipseInfo info = new EllipseInfo(ellipse, speedRatio * random.Next(minStartingSpeed, maxStartingSpeed));

                    listEllipse.Add(info);

                }

            }

            else

            {

                for(int i = listEllipse.Count - 1; i >= 0; i--)

                {

                    EllipseInfo info = listEllipse[i];

                    double top = Canvas.GetTop(info.Ellipse);

                    Canvas.SetTop(info.Ellipse, top + 1 * info.VelocityY);

                    if (top >= canvas.ActualHeight - ellipseRadius * 2 - 10)

                    {

                        listEllipse.Remove(info);

                    }

                    else

                    {

                        info.VelocityY += acclerationY;

                    }

                    if (listEllipse.Count == 0)

                    {

                        StopRendering();

                    }

                }

            }

        }

        private void StopRendering()

        {

            CompositionTarget.Rendering -= CompositionTarget_Rendering;

            rendering = false;

        }

        private void btnStart_Click(object sender, RoutedEventArgs e)

        {

            if (rendering == false)

            {

                listEllipse.Clear();

                canvas.Children.Clear();

                CompositionTarget.Rendering += CompositionTarget_Rendering;

                rendering = true;

            }

        }

        private void btnStop_Click(object sender, RoutedEventArgs e)

        {

            StopRendering();

  }

原图:

效果图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值