using System;
|
using Microsoft.Windows.Forms.Animate;
|
|
namespace Microsoft.Windows
|
{
|
/// <summary>
|
/// 两段渐进动画动画
|
/// </summary>
|
public sealed class UIGradientAnimation : Animation<float>
|
{
|
private const float ANIMATION_DURATION = 500; //动画持续时间(毫秒)
|
private const float FIRST_TIME = 0.5f * ANIMATION_DURATION; //第一段时间(毫秒)
|
private const float FIRST_PERCENT = 0.875f; //第一段百分比
|
private const float SECOND_TIME = ANIMATION_DURATION - FIRST_TIME; //第二段时间(毫秒)
|
private const float SECOND_PERCENT = 1f - FIRST_PERCENT; //第二段百分比
|
|
private float m_From;
|
/// <summary>
|
/// 获取或设置起点
|
/// </summary>
|
public float From
|
{
|
get { return this.m_From; }
|
set { this.m_From = value; }
|
}
|
|
private float m_To;
|
/// <summary>
|
/// 获取或设置终点
|
/// </summary>
|
public float To
|
{
|
get { return this.m_To; }
|
set { this.m_To = value; }
|
}
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
public UIGradientAnimation()
|
{
|
}
|
|
/// <summary>
|
/// 获取当前滑动距离
|
/// </summary>
|
public override float Current
|
{
|
get
|
{
|
float distance = this.m_To - this.m_From;
|
float escaped = (float)(DateTime.Now - this.StartTime).TotalMilliseconds;
|
if (escaped < FIRST_TIME)//公式 第一段时间/第一段距离=流逝时间/移动距离
|
return this.m_From + escaped / FIRST_TIME * distance * FIRST_PERCENT;
|
if (escaped < ANIMATION_DURATION)//公式 第二段时间/第二段距离=(流逝时间-第一段时间)/(移动距离-第一段距离)
|
return this.m_From + (escaped - FIRST_TIME) / SECOND_TIME * distance * SECOND_PERCENT + distance * FIRST_PERCENT;
|
this.Stop();
|
return this.m_To;
|
}
|
}
|
|
/// <summary>
|
/// 重新开始动画
|
/// </summary>
|
public void Next()
|
{
|
base.Start();
|
}
|
|
/// <summary>
|
/// 释放资源
|
/// </summary>
|
/// <param name="disposing">释放托管资源为true,否则为false</param>
|
protected override void Dispose(bool disposing)
|
{
|
}
|
}
|
}
|