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)
        {
        }
    }
}