动画和定时器是紧密相关的,下面的三个例子既可以说是定时器,也可以说是动画。
编码使用定时器
编码方式使用定时器,最简单的就是使用 System.windows.Threading 命名空间的 dispatcherTimer 类。虽然也可以用 System.Timers.Timer,但是实现就会复杂多了,不推荐使用System.Timers.Timer,原因如下:
在每个 dispatcher (管理线程工作项队列的服务)循环的顶端重新计算 dispatcherTimer。 这样 dispatcherTimer 不能保证会正好在时间间隔发生时执行计时器,但能够保证不会在时间间隔发生之前执行计时器。 这是因为 dispatcherTimer *** 作与其他 *** 作一样被放置到 dispatcher 队列中。 何时执行 dispatcherTimer *** 作取决于队列中的其他作业及其优先级。
如果 System.Timers.Timer 用于 WPF/Silverlight 应用程序,则值得注意的是 System.Timers.Timer 运行于不同于用户界面 (UI) 线程的其他线程上。 为了访问用户界面 (UI) 线程上的对象,需要使用 Invoke 或 BeginInvoke 将 *** 作发布到用户界面 (UI) 线程的 dispatcher 上。
使用 dispatcherTimer 而不是使用 System.Timers.Timer 的原因是 dispatcherTimer 与 dispatcher(管理线程工作项队列的服务) 运行于相同的线程,并且可以在 dispatcherTimer 上设置 dispatcherPriority。
使用 dispatcherTimer 的例子
XAML 文件
<GrID x:name="LayoutRoot" Background="White"> <TextBlock Loaded="StartTimer" x:name="myTextBlock" /> GrID>
代码文件
public voID StartTimer(object o,RoutedEventArgs sender){ System.windows.Threading.dispatcherTimer mydispatcherTimer = new System.windows.Threading.dispatcherTimer(); mydispatcherTimer.Interval = new TimeSpan(0,100); // 100 Milliseconds mydispatcherTimer.Tick += new EventHandler(Each_Tick); mydispatcherTimer.Start();}// A variable to count with.int i = 0;// Raised every 100 miliseconds while the dispatcherTimer is active.public voID Each_Tick(object o,EventArgs sender){ myTextBlock.Text = "Count up: " + i++.ToString();}
使用故事版来做的定时器
我们在 Storyboard 的 Completed 事件中再次把Storyboard 起来: myTimer.Begin(); 这就相当于一个定时器。
XAML文件
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MySilverlight3Study_Animation3.MainPage" WIDth="180" Height="120"> <UserControl.Resources> <Storyboard x:name="myTimer" Duration="00:00:01" Completed="myTimer_Completed" /> UserControl.Resources> <GrID x:name="LayoutRoot" Background="White"> <GrID.RowDeFinitions> <RowDeFinition/> <RowDeFinition/> GrID.RowDeFinitions> <button x:name="btn" Height="36" margin="20,5" Content="开始" GrID.Row="1" Click="button_Click"/> <TextBlock x:name="txt" GrID.Row="0" Height="40" WIDth="60" Text="0" textwrapPing="Wrap" Foreground="#FFA72222" FontSize="26.667" FontFamily="Comic Sans MS" FontWeight="Bold" TextAlignment="Center" lineHeight="9.333"/> GrID> UserControl>
代码文件
using System;using System.windows;using System.windows.Controls;using System.windows.documents;using System.windows.Ink;using System.windows.input;using System.windows.Media;using System.windows.Media.Animation;using System.windows.Shapes;namespace MySilverlight3Study_Animation3{ public partial class MainPage : UserControl { public MainPage() { // 为初始化变量所必需 InitializeComponent(); } private bool isstop = true; private voID button_Click(object sender,System.windows.RoutedEventArgs e) { if(isstop) { btn.Content = "暂停"; myTimer.Begin(); } else { btn.Content = "继续"; myTimer.Stop(); } isstop = !isstop; } private int i = 0; private voID myTimer_Completed(object sender,EventArgs e) { i++; txt.Text = string.Format("{0}",i); myTimer.Begin(); } }}
用 CompositionTarget.Rendering 来做动画和定时器
除了之前提到的几种动画方式,还有一种只能使用代码创建的基于帧的动画方式。需要做的全部工作是响应静态的 CompositionTarget.Rendering 事件,触发该事件是为了为每帧获取内容。这是一种非常低级的方法,除非使用标准的基于属性的动画模型不能满足需要(例如,构建一个简单的游戏、创建一个基于物理的动画,或者构建粒子效果模型(如火焰、雪以及气泡)),否则不会希望使用这种方法。
构建基于帧的动画的基本技术很容易。只需要简单地为静态的CompositionTarget.Rendering事件关联事件处理程序。一旦关联了事件处理程序,Silverlight就会开始不断地调用这个事件处理程序(只要渲染代码执行得足够快,每秒将会调用60次)。
下面是一个简单的演示代码:
using System;using System.windows;using System.windows.Controls;using System.windows.documents;using System.windows.Ink;using System.windows.input;using System.windows.Media;using System.windows.Media.Animation;using System.windows.Shapes;namespace MySilverlight3Study_Animation3{ public partial class MainPage : UserControl { public MainPage() { // 为初始化变量所必需 InitializeComponent(); System.windows.Media.CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering); } voID CompositionTarget_Rendering(object sender,EventArgs e) { txt.Text = DateTime.Now.ToString(); } }}
Xaml 文件
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MySilverlight3Study_Animation3.MainPage" WIDth="180" Height="120"> <TextBlock x:name="txt" Text="1" margin="20" Foreground="Red" TextAlignment="Center" /> UserControl>
一般游戏,为了性能,都是使用 CompositionTarget.Rendering 事件来做的。而不是之前的2种方式。
参考资料:
Silverlight Timers,what to use?
http://advertboy.wordpress.com/2007/08/11/silverlight-timers-what-to-use/
在Silverlight中使用定时器(Timer)
http://blog.csdn.net/SilverlightShanghai/archive/2007/09/02/1768874.aspx
Silverlight 2 手把手(之六) 使用故事版实现定时器
http://blogs.msdn.com/jijia/archive/2008/04/30/silverlight2-timer-storyboard.aspx
Silverlight 2 手把手(之五) 编程实现定时器
http://blogs.msdn.com/jijia/archive/2008/04/29/programming-timer.aspx
How to: Create a Timer
http://msdn.microsoft.com/en-us/library/cc189084(VS.95).aspx
Make a Silverlight Timer (Silverlight 2)
http://blogs.msdn.com/silverlight_sdk/archive/2008/03/27/make-a-silverlight-timer-silverlight-2.aspx
21.4.5 基于帧的动画
http://book.51cto.com/art/200908/145560.htm
Silverlight: How to use CompositionTarget.Rendering event to synchronize discrete and non-discrete animations
http://blogs.msdn.com/marlat/archive/2009/05/24/silverlight-use-compositiontarget-rendering-event-to-synchronize-discrete-and-non-discrete-animations.aspx
CompositionTarget.Rendering事件
http://blog.etvalley.com/index.php/archives/tag/compositiontargetrendering
Silverlight制作逐帧动画 v2 - part1
http://www.cnblogs.com/nasa/archive/2009/09/11/imageBrush-Animate.html
Silverlight制作逐帧动画 v2 - part2
http://www.cnblogs.com/nasa/archive/2009/09/12/imageBrush-Animate-part2.html
Silverlight制作逐帧动画 v2 - part3
http://www.cnblogs.com/nasa/archive/2009/09/13/imageBrush-Animate-part3.html
Blend基础-动画
http://www.cnblogs.com/nasa/archive/2009/11/03/Expression_Blend_Essentials_Animation.html
以上是内存溢出为你收集整理的Silverlight 动画与定时器全部内容,希望文章能够帮你解决Silverlight 动画与定时器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)