-
先上效果图:
该截图为png静态图,但程序本身运行过程中,是动态的过程,钞票持续往下落。该动画被封装成一个自定义控件,
公布出如下依赖属性:
Progress 钞票张数,即相应的钞票动画数量。
AnimationDuringTime 单张钞票从开始到停止所耗费的时间。
HeightBetween 钞票动画结束后,图像之间的高度间隙,默认0.5个像素
TakingInterval 钞票动画之间的间隔时间,默认100毫秒
ImageHeight 钞票高度
ImageWidth 钞票宽度
ImageSkewTransformX 图像X方向歪斜角度
-
部分核心动画代码
1 private void InitThread() 2 { 3 Action action = new Action(() => 4 { 5 Rectangle rectangle = new Rectangle(); 6 rectangle.Name = "rectangle"; 7 8 NameScope nameScope = new NameScope(); 9 NameScope.SetNameScope(this, nameScope); 10 this.RegisterName(rectangle.Name, rectangle); 11 12 ImageBrush imageBrush = new ImageBrush(); 13 imageBrush.ImageSource = (BitmapImage)this.FindResource(imageResource); 14 15 rectangle.Fill = imageBrush; 16 rectangle.Height = ImageHeight; 17 rectangle.Width = ImageWidth; 18 Canvas.SetLeft(rectangle, originalLeft); 19 Canvas.SetTop(rectangle, 0); 20 //rectangle.RenderTransformOrigin = new Point(0.5, 0.5); 21 22 TransformGroup transformGroup = new TransformGroup(); 23 transformGroup.Children.Add(new ScaleTransform()); 24 transformGroup.Children.Add(new SkewTransform(ImageSkewTransformX, 0)); 25 transformGroup.Children.Add(new RotateTransform()); 26 transformGroup.Children.Add(new TranslateTransform()); 27 28 rectangle.RenderTransform = transformGroup; 29 this.LayoutRoot.Children.Add(rectangle); 30 31 DoubleAnimationUsingKeyFrames daukfX = new DoubleAnimationUsingKeyFrames(); 32 EasingDoubleKeyFrame easingDoubleKeyFrame = new EasingDoubleKeyFrame(); 33 easingDoubleKeyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(AnimationDuringTime)); 34 easingDoubleKeyFrame.Value = translateTransformX; 35 daukfX.KeyFrames.Add(easingDoubleKeyFrame); 36 37 DoubleAnimationUsingKeyFrames daukfY = new DoubleAnimationUsingKeyFrames(); 38 EasingDoubleKeyFrame easingDoubleKeyFrameY = new EasingDoubleKeyFrame(); 39 easingDoubleKeyFrameY.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(AnimationDuringTime)); 40 translateTransformY -= HeightBetween; 41 easingDoubleKeyFrameY.Value = translateTransformY; 42 daukfY.KeyFrames.Add(easingDoubleKeyFrameY); 43 44 Storyboard storyboard = new Storyboard(); 45 storyboard.Children.Add(daukfX); 46 storyboard.Children.Add(daukfY); 47 48 Storyboard.SetTargetName(daukfX, rectangle.Name); 49 Storyboard.SetTargetName(daukfY, rectangle.Name); 50 Storyboard.SetTargetProperty(daukfX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)")); 51 Storyboard.SetTargetProperty(daukfY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)")); 52 storyboard.Begin(this); 53 }); 54 55 thread = new Thread(() => 56 { 57 while (true) 58 { 59 if (index < progress && index < maxNumber) 60 { 61 index++; 62 Dispatcher.BeginInvoke(action); 63 } 64 System.Threading.Thread.Sleep(takingIntervl); 65 } 66 }); 67 thread.IsBackground = true; 68 thread.Start(); 69 }
1 public static readonly DependencyProperty ProgressProperty = DependencyProperty.Register( 2 "Progress", typeof(int), typeof(CashUserControl), new FrameworkPropertyMetadata 3 (0, new PropertyChangedCallback(OnProgressChanged))); 4 5 private static void OnProgressChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 6 { 7 CashUserControl cashUserControl = sender as CashUserControl; 8 int newValue = (int)e.NewValue; 9 int oldValue = (int)e.OldValue; 10 cashUserControl.OnProgressChanged(newValue, oldValue); 11 } 12 13 /// <summary> 14 /// 落钞数量 15 /// </summary> 16 public int Progress 17 { 18 get 19 { 20 return (int)GetValue(ProgressProperty); 21 } 22 set 23 { 24 SetValue(ProgressProperty, value); 25 } 26 } 27 28 protected virtual void OnProgressChanged(int newValue, int oldValue) 29 { 30 //依赖属性值赋值给局部变量,跨线程调用的问题。 31 progress = Progress; 32 33 //取走钞票后重置数据 34 if (Progress == 0) 35 { 36 index = 0; 37 translateTransformY = Height - ImageHeight - 5; 38 this.LayoutRoot.Children.Clear(); 39 } 40 }
View Code