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


猜你喜欢
- 文件的重命名与移动操作有时候为了对文件进行统一访问与管理,需要把文件进行重命名,并移动到新的文件夹,如何实现呢?一枚简单的java小程序即可
- 本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。不多说,上代码:package deal;import
- FrameLayout(帧布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayo
- @Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会
- /** * 快速计算二进制数中1的个数(Fast Bit Counting) * 该算法的思想如下: * 每次将该数与该数减一后的数值
- 本文实例讲述了Spring的组合注解和元注解原理与用法。分享给大家供大家参考,具体如下:一 点睛从Spring 2开始,为了相应JDK 1.
- 一、题目描述题目实现:使用网络编程时,需要通过Socket传递对象。二、解题思路创建一个类:Student,实现序列化Student类包含两
- Android开发环境有三种方式,分别是JDK+SDK+Eclipse+ADT、JDK+adt-bundle与JDK+Android Stu
- 对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。本文介绍的是除数据库之外的几种对象持久化方式。具体如下:保存成
- 项目效果实现代码using System;namespace 飞行棋项目{ class Program  
- 1.项目介绍这是一款基于 Java 开发的移动端安卓小游戏——大家来拼图2.项目原理把选定的一张图片
- 测试例:PageElement pe = new PageElement();pe.LoadDataFromJsonString("
- 首先客户端从服务器端获取json数据1、利用HttpUrlConnection/** &nbs
- 首先要解析string类型的xml必须先要将其转化成dom格式,然后再进行解析取值,如下是解析代码示例:package com.compan
- 这篇文章主要介绍了Springboot如何设置静态资源缓存一年,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 本文实例为大家分享了viewGroup实现点击动画效果展示的具体代码,供大家参考,具体内容如下public class MyCustomVi
- C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验,分享给大家
- 1、背景我有一堆学生数据,其中湖北省的学生需要排在所有数据的最前面。其余省正序排序,对于同一个省的数据,按照年龄倒序排序。2、分析对于上方的
- 首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。下篇再仔细讲讲为什么要这么写。效果图:实现了三个
- 一、图示我们先来看看今天要介绍哪些内存溢出案例,这里总结了一张图,如下所示。二、定义主类结构首先,我们创建一个名称为BlowUpJVM的类,