wpf基于帧的动画

来源:互联网 发布:java手机游戏安卓版 编辑:程序博客网 时间:2024/06/04 19:40
<Window x:Class="WpfApplication1.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        mc:Ignorable="d"        Title="MainWindow" Height="396" Width="463.2">    <Grid>        <Grid.RowDefinitions>            <RowDefinition Height="auto"/>            <RowDefinition />        </Grid.RowDefinitions>        <StackPanel Orientation="Horizontal">            <Button Margin="3" Padding="3" Click="Button_Click">Start</Button>            <Button Margin="3" Padding="3" Click="Button_Click_1">Stop</Button>        </StackPanel>        <Canvas x:Name="canvas" Grid.Row="1" Margin="3"></Canvas>    </Grid></Window>
using System;using System.Collections.Generic;using System.Windows;using System.Windows.Controls;using System.Windows.Media;using System.Windows.Shapes;namespace WpfApplication1{    /// <summary>    /// MainWindow.xaml 的交互逻辑    /// </summary>    public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        private List<EllipseInfo> ellipses = new List<EllipseInfo>();        private double accelerationY = 0.1;        private int minStartSpeed = 1;        private int maxStartSpeed = 50;        private double speedRatio = 0.1;        private int minEllipses = 20;        private int maxEllipses = 100;        private int ellipseRadius = 10;        private bool rendering = false;        public class EllipseInfo        {            public Ellipse Ellipse            {                get;                set;            }            public double VelocityY            {                get;                set;            }            public EllipseInfo(Ellipse ellipse, double velocityY)            {                VelocityY = velocityY;                Ellipse = ellipse;            }        }        private void Button_Click(object sender, RoutedEventArgs e)        {            if (!rendering)            {                ellipses.Clear();                canvas.Children.Clear();                CompositionTarget.Rendering += RenderFrame;            }        }        private void RenderFrame(object sender, EventArgs e)        {            if (0 == ellipses.Count)            {                int halfCanvasWidth = (int)canvas.ActualWidth / 2;                Random rand = new Random();                int ellipseCount = rand.Next(minEllipses, maxEllipses);                for (int i = 0; i < ellipseCount; ++i)                {                    Ellipse ellipse = new Ellipse();                    ellipse.Fill = Brushes.LimeGreen;                    ellipse.Width = ellipseRadius;                    ellipse.Height = ellipseRadius;                    Canvas.SetLeft(ellipse, halfCanvasWidth + rand.Next(-halfCanvasWidth, halfCanvasWidth));                    Canvas.SetTop(ellipse, 0);                    canvas.Children.Add(ellipse);                    EllipseInfo info = new EllipseInfo(ellipse, speedRatio * rand.Next(minStartSpeed, maxStartSpeed));                    ellipses.Add(info);                }            }            else            {                for (int i = 0; i < ellipses.Count; ++i)                {                    EllipseInfo info = ellipses[i];                    double top = Canvas.GetTop(info.Ellipse);                    Canvas.SetTop(info.Ellipse, top + 1 * info.VelocityY);                    if (top >= canvas.ActualHeight - ellipseRadius * 2 - 10)                    {                        ellipses.Remove(info);                    }                    else                    {                        info.VelocityY += accelerationY;                    }                    if(0==ellipses.Count)                    {                        StopRendering();                    }                }            }        }        private void StopRendering()        {            CompositionTarget.Rendering -= RenderFrame;            rendering = false;        }        private void Button_Click_1(object sender, RoutedEventArgs e)        {            StopRendering();        }    }}
原创粉丝点击