现在的位置: 首页 > 综合 > 正文

WPF开发点钞动画

2013年03月25日 ⁄ 综合 ⁄ 共 3569字 ⁄ 字号 评论关闭
  • 先上效果图:

 

 该截图为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

 

 

抱歉!评论已关闭.