WPF实现文字粒子闪烁动画效果

作者:RunnerDNA 时间:2022-01-12 23:56:45 

本文实例为大家分享了WPF实现文字粒子闪烁动画的具体代码,供大家参考,具体内容如下

实现效果如下:

WPF实现文字粒子闪烁动画效果

思路:首先根据显示文本创建文本路径Geometry,然后在路径内随机生成圆形粒子并添加动画。

步骤:

1、粒子类Particle.cs


public class Particle
{
 /// <summary>
 /// 形状
 /// </summary>
 public Ellipse Shape;
 /// <summary>
 /// 坐标
 /// </summary>
 public Point Position;
}

2、粒子系统ParticleSystem.cs


/// <summary>
/// 粒子路径
/// </summary>
private Geometry particleGeometry;

/// <summary>
/// 粒子个数
/// </summary>
private int particleCount = 100;

/// <summary>
/// 粒子最小尺寸
/// </summary>
private static int sizeMin = 10;

/// <summary>
/// 粒子最大尺寸
/// </summary>
private int sizeMax = 20;

/// <summary>
/// 随机数
/// </summary>
private Random random;

/// <summary>
/// 粒子列表
/// </summary>
private List<Particle> particles;

/// <summary>
/// 粒子容器
/// </summary>
private Canvas containerParticles;

public ParticleSystem(Geometry _path, int _maxRadius, int _particleCount, Canvas _containerParticles)
 {
  particleGeometry = _path;
  particleCount = _particleCount;
  sizeMax = _maxRadius;
  containerParticles = _containerParticles;
  random = new Random();
  particles = new List<Particle>();
  SpawnParticle();
 }

/// <summary>
 /// 初始化粒子
 /// </summary>
 private void SpawnParticle()
 {
  //清空粒子队列
  particles.Clear();
  containerParticles.Children.Clear();

//生成粒子
  for (int i = 0; i < particleCount; i++)
  {
   double size = random.Next(sizeMin, sizeMax + 1);
   while(true)
   {
    Point po = new Point(random.Next((int)particleGeometry.Bounds.Left, (int)particleGeometry.Bounds.Right), random.Next((int)particleGeometry.Bounds.Top, (int)particleGeometry.Bounds.Bottom));
    if (particleGeometry.FillContains(po, 2, ToleranceType.Absolute))
    {
     Particle p = new Particle
     {
      Shape = new Ellipse
      {
       Width = size,
       Height = size,
       Stretch = System.Windows.Media.Stretch.Fill,
       Fill = GetRandomColorBursh(),
      },
      Position = po,
     };
     SetParticleSizeAnimation(p.Shape);
     particles.Add(p);
     Canvas.SetLeft(p.Shape, p.Position.X);
     Canvas.SetTop(p.Shape, p.Position.Y);
     containerParticles.Children.Add(p.Shape);
     break;
    }
   }
  }
 }

/// <summary>
 /// 设置粒子大小动画
 /// </summary>
 private void SetParticleSizeAnimation(Ellipse p)
 {
  Storyboard sb = new Storyboard();
  //动画完成事件 再次设置此动画
  sb.Completed += (S, E) =>
  {
   SetParticleSizeAnimation(p);
  };
  int size = random.Next(sizeMin, sizeMax + 1);
  int time = random.Next(100, 1000);
  DoubleAnimation daX = new DoubleAnimation(size, new Duration(TimeSpan.FromMilliseconds(time)));
  DoubleAnimation daY = new DoubleAnimation(size, new Duration(TimeSpan.FromMilliseconds(time)));
  Storyboard.SetTarget(daX, p);
  Storyboard.SetTarget(daY, p);
  Storyboard.SetTargetProperty(daX, new PropertyPath("Width"));
  Storyboard.SetTargetProperty(daY, new PropertyPath("Height"));
  sb.Children.Add(daX);
  sb.Children.Add(daY);
  sb.Begin();
 }

/// <summary>
 /// 获取随机颜色画刷
 /// </summary>
 private SolidColorBrush GetRandomColorBursh()
 {
  byte r = (byte)random.Next(128, 256);
  byte g = (byte)random.Next(128, 256);
  byte b = (byte)random.Next(128, 256);
  return new SolidColorBrush(Color.FromArgb(125, r, g, b));
}

3、主窗体交互


private ParticleSystem ps;

public MainWindow()
 {
  InitializeComponent();
  this.Loaded += MainWindow_Loaded;
 }

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
 {
  Geometry g = CreateTextPath("H E L L O", new Point(this.cvs_particleContainer.Margin.Left, this.cvs_particleContainer.Margin.Top), new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Bold, FontStretches.Normal), 200);
  ps = new ParticleSystem(g, 25, 350, this.cvs_particleContainer);
 }

/// <summary>
 /// 创建文本路径
 /// </summary>
 /// <param name="word">文本字符串</param>
 /// <param name="point">显示位置</param>
 /// <param name="typeface">字体信息</param>
 /// <param name="fontSize">字体大小</param>
 /// <returns></returns>
 private Geometry CreateTextPath(string word, Point point, Typeface typeface, int fontSize)
 {
  FormattedText text = new FormattedText(word, new System.Globalization.CultureInfo("en-US"), FlowDirection.LeftToRight, typeface, fontSize, Brushes.Black);
  Geometry g = text.BuildGeometry(point);
  PathGeometry path = g.GetFlattenedPathGeometry();
  return path;
}

来源:https://blog.csdn.net/dnazhd/article/details/108226666

标签:WPF,粒子闪烁,文字闪烁
0
投稿

猜你喜欢

  • C#下实现创建和删除目录的实例代码

    2021-10-21 16:04:31
  • Android 实现全屏和无标题栏的显示

    2023-08-23 14:24:23
  • 基于C#的socket编程的TCP异步的实现代码

    2023-04-13 06:42:05
  • Android开发中4个常用的工具类【Toast、SharedPreferences、网络及屏幕操作】

    2023-12-01 22:53:40
  • java map转Multipart/form-data类型body实例

    2023-04-19 13:16:18
  • Spring整合Dubbo框架过程及原理解析

    2022-01-31 01:49:16
  • java中如何截取字符串最后一位

    2023-11-27 00:51:16
  • 通过实例解析JMM和Volatile底层原理

    2023-05-20 19:10:48
  • idea maven pom不自动更新的解决方法

    2021-11-19 14:56:46
  • java中JSONObject转换为HashMap(方法+main方法调用实例)

    2023-08-10 04:04:08
  • Android集成百度地图开发流程和注意事项

    2022-03-21 01:56:01
  • 教你怎么在IDEA中创建java多模块项目

    2023-05-28 19:25:58
  • MyBatisPlus深入探究映射匹配的兼容性

    2023-01-08 08:57:26
  • SpringMVC框架post提交数据库出现乱码解决方案

    2022-03-01 09:50:41
  • C# 使用SpecFlow创建BDD测试用例的示例代码

    2021-05-25 21:35:00
  • 教大家使用java实现顶一下踩一下功能

    2021-08-08 21:31:15
  • 国内分布式框架Dubbo使用详解

    2022-05-10 13:38:27
  • java和Spring中观察者模式的应用详解

    2023-04-21 00:16:17
  • spring mvc中直接注入的HttpServletRequst安全吗

    2021-12-29 07:48:16
  • java ThreadLocal使用案例详解

    2022-02-01 05:14:57
  • asp之家 软件编程 m.aspxhome.com