------------------------------------------------
--作者: gzg
--日期: 2020-12-19
--文件: AnimValue01.lua
--模块: AnimValue01
--描述: 数据动画,在一个时间段,让这个值从0到1变化
------------------------------------------------

local AnimValue01 = {
    
    --开始时间点
    StartTime = 0,
    --延迟时间
    Delay = 0,
    --播放长度
    Duration = 0,
    --是否启动
    Enabled = false,

    --逝去的时间
    Elapse = 0,

    --当前值[0,1]
    CurrValue = 0,

    --数据改变的回调
    OnHandler = nil,

    --速度数据
    SpeedData = List:New(),
}

--创建一个新的对象
function AnimValue01:New()
    local _m = Utils.DeepCopy(self)
    _m.SpeedData = List:New();
    return _m
end

--开始播放,
--delay: 表示延迟动画的时间
--duration:表示播放动画的时间
--handler:每帧值得改变通过这个回调返回,可以不传,主动获取当前值,传参需要通过Utils.Handler进行封装
function AnimValue01:Start(delay,duration,handler)
    local _typeX = type(delay)
    if _typeX == "number" or _typeX ~= "nil" then
        self.Delay = delay;
    else
        self.Delay = 0;
    end

    _typeX = type(duration)
    if _typeX == "number" or _typeX ~= "nil" then
        self.Duration = duration;
    else
        self.Duration = 0;
    end
    self.StartTime = Time.GetRealtimeSinceStartup();
    self.CurrValue = 0;
    self.Enabled = true;
    self.OnHandler = handler;
end

--停止动画
function AnimValue01:Stop()    
    self.Delay = 0;
    self.Duration = 0;
    self.Enabled = false;
end

--获取当前值
function AnimValue01:GetCurValue()
    return self.CurrValue;
end

--设置动画的速度数据,其中值是一个数组. 例如: [1,1,1,2,3,4,5,10]表示速度越来越快,[10,8,4,2,1,1,1]表示速度越来越慢
--算法描述:根据数组中值的数量,把时间分割为N等分,当值越大,表示当前等分得时间段速度越快.
function AnimValue01:SetSpeed(list)
    
    local _sum = 0;
    local _tmp = 0;
    --把有效数据增加到速度数据中
    self.SpeedData:Clear();
    for i=1,#list do
        if list[i] > 0 then
            self.SpeedData:Add(list[i]);
        end
    end

    --计算总量
    for i = 2,self.SpeedData:Count() do
        self.SpeedData[i] = self.SpeedData[i]+self.SpeedData[i-1];
    end

    --格式化数据
    if self.SpeedData:Count() > 0 then
        _sum = self.SpeedData[self.SpeedData:Count()];
        for i = 1,#self.SpeedData do
            self.SpeedData[i] = self.SpeedData[i] / _sum;
        end
        --最后一个设置为1
        self.SpeedData[self.SpeedData:Count()] = 1;
    else        
        self.SpeedData.Add(1);
    end
end

--更新,需要有外部一个驱动进行调用.
function AnimValue01:Update()
    if self.Enabled then
        if self.Duration > 0 then
            self.Elapse = Time.GetRealtimeSinceStartup() - self.StartTime;
            self.CurrValue = (self.Elapse - self.Delay)/self.Duration
            self.CurrValue = self:FixedValue(self.CurrValue)
        else
            self.CurrValue = 1;
        end
        --判断是否结束
        if self.CurrValue >= 1 then
            self.CurrValue = 1;
            self.Enabled = false;
        end
        --回调处理
        if self.OnHandler then
            self.OnHandler(self.CurrValue,self.Enabled);
        end
    end
end

--根据速度,对最终的数据进行修正 --私有函数
function AnimValue01:FixedValue(val)
    if val < 0 then
        val = 0;
    end
    if val > 1 then
        val = 1;
    end
    --速度数据的长度
    local _len = self.SpeedData:Count();
    if _len > 1 then        
        local _val= _len * val;
        --获取索引
        local idx = math.floor(_val);
        --获取增量
        local _delta = _val - idx;
        --获取插值的起始数据
        local from = 0;
        if idx > 0 then
            from = self.SpeedData[idx];
        end
        --获取终点数据
        local to = 1
        if idx < _len then
           to = self.SpeedData[idx+1];
        end        
        val = (to - from) * _delta + from;
    end
    return val;
end
return AnimValue01