WPF實現文字粒子閃爍動畫效果
阿新 • • 發佈:2020-08-30
本文例項為大家分享了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; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。