Animation.cs
97 lines
| 2.5 KiB
| text/x-csharp
|
CSharpLexer
/ Implab.Fx / Animation.cs
cin
|
r3 | using System; | ||
using System.Collections.Generic; | ||||
using System.Linq; | ||||
using System.Text; | ||||
cin
|
r4 | using System.Timers; | ||
using System.ComponentModel; | ||||
using System.Diagnostics; | ||||
cin
|
r3 | |||
namespace Implab.Fx | ||||
{ | ||||
cin
|
r4 | public delegate void AnimationStep<T>(T target, int elapsed, int duration); | ||
public class Animation<TArg> where TArg: class | ||||
cin
|
r3 | { | ||
int m_duration; | ||||
cin
|
r4 | int m_delay; | ||
int m_elapsed; | ||||
int m_prevTicks; | ||||
TArg m_arg; | ||||
ISynchronizeInvoke m_syncronizationObject; | ||||
public event AnimationStep<TArg> Step; | ||||
Promise<TArg> m_promise; | ||||
public Animation(TArg target, int duration, int delay) | ||||
{ | ||||
if (duration <= 0) | ||||
throw new ArgumentOutOfRangeException("duration"); | ||||
if (delay <= 0) | ||||
throw new ArgumentOutOfRangeException("delay"); | ||||
m_arg = target; | ||||
m_syncronizationObject = target as ISynchronizeInvoke; | ||||
m_duration = duration; | ||||
m_delay = delay; | ||||
m_promise = new Promise<TArg>(); | ||||
} | ||||
public Animation(TArg target) | ||||
: this(target, 500, 30) | ||||
{ | ||||
} | ||||
public TArg Traget | ||||
{ | ||||
get { return m_arg; } | ||||
} | ||||
cin
|
r3 | |||
cin
|
r4 | public Promise<TArg> Play() | ||
{ | ||||
var timer = new Timer(m_delay); | ||||
cin
|
r6 | timer.AutoReset = false; | ||
cin
|
r4 | timer.SynchronizingObject = m_syncronizationObject; | ||
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); | ||||
cin
|
r3 | |||
cin
|
r4 | m_prevTicks = Environment.TickCount; | ||
timer.Start(); | ||||
return m_promise; | ||||
} | ||||
void timer_Elapsed(object sender, ElapsedEventArgs args) | ||||
{ | ||||
var timer = sender as Timer; | ||||
var dt = Environment.TickCount - m_prevTicks; | ||||
m_prevTicks = Environment.TickCount; | ||||
m_elapsed += dt; | ||||
if (m_elapsed > m_duration) | ||||
m_elapsed = m_duration; | ||||
try | ||||
{ | ||||
var handler = Step; | ||||
if (handler != null) | ||||
handler(m_arg, m_elapsed, m_duration); | ||||
} | ||||
catch (Exception e) | ||||
{ | ||||
Trace.TraceError(e.ToString()); | ||||
} | ||||
if (m_elapsed < m_duration) | ||||
timer.Start(); | ||||
else | ||||
{ | ||||
timer.Dispose(); | ||||
m_promise.Resolve(m_arg); | ||||
} | ||||
} | ||||
cin
|
r3 | } | ||
} | ||||