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
投稿

猜你喜欢

  • 浅析Java随机数与定时器

    2022-06-04 16:21:10
  • mybatis-plus使用问题小结

    2023-10-30 06:45:58
  • Android应用程序转到后台并回到前台判断方法

    2022-11-12 19:49:35
  • SpringBoot+JPA 分页查询指定列并返回指定实体方式

    2021-08-26 11:54:57
  • Android仿简书搜索框效果的示例代码

    2023-06-18 16:02:58
  • java 进制转换实例详解

    2023-07-05 11:53:45
  • JSch教程使用sftp协议实现服务器文件载操作

    2023-10-29 17:43:33
  • SpringMvc返回modelandview返回的页面无法跳转问题及解决

    2023-02-07 23:49:51
  • Java使用JDK与Cglib动态代理技术统一管理日志记录

    2021-11-09 00:52:31
  • 深入理解Java中的final关键字_动力节点Java学院整理

    2022-05-05 23:18:24
  • springboot整合mybatis的超详细过程(配置模式+注解模式)

    2023-10-03 09:54:03
  • C#将指定目录所有文件名转换成小写的方法

    2023-01-25 23:21:03
  • Java内存区域和内存模型讲解

    2023-11-26 12:08:39
  • C#正则表达式匹配HTML中的图片路径,图片地址代码

    2023-03-10 16:33:48
  • 解决Eclipse的Servers视图中无法添加Tomcat6/Tomcat7的方法

    2023-03-30 22:22:27
  • Android按钮单击事件的四种常用写法总结

    2023-07-15 09:05:18
  • 详解Mybatis框架SQL防注入指南

    2023-09-16 02:49:02
  • Java线程安全中的有序性浅析

    2023-07-12 03:07:58
  • 老生常谈反射之Class类的使用(必看篇)

    2022-07-20 16:32:30
  • maven中配置项目的jdk版本无效的排查方式

    2023-07-18 21:43:42
  • asp之家 软件编程 m.aspxhome.com