|
|
|
|
|
TweenLite = TweenLite or BaseClass()
|
|
local TweenLite = TweenLite
|
|
local math_min = math.min
|
|
local Status = Status
|
|
local table_insert = table.insert
|
|
local IsTableEmpty = IsTableEmpty
|
|
local GetLocalPositionX = GetLocalPositionX
|
|
local GetLocalPositionY = GetLocalPositionY
|
|
local SetLocalPositionX = SetLocalPositionX
|
|
local SetLocalPositionY = SetLocalPositionY
|
|
TweenLite.UiAnimationType = {
|
|
POS = "POS",
|
|
POSX = "POSX",
|
|
POSY = "POSY",
|
|
ALPHA = "ALPHA", --新版的alpha 不要用旧版的
|
|
ALPHA_OLD = "ALPHA_OLD",--旧版的alpha变化 后续不要再调用
|
|
WIDTH = "WIDTH",
|
|
HEIGHT = "HEIGHT",
|
|
ROTATION = "ROTATION", --rotateion.z
|
|
CANVAS_POSX="CANVAS_POSX",
|
|
CANVAS_POSY="CANVAS_POSY",
|
|
SCALE = "SCALE",
|
|
ROTATION_Y = "ROTATION_Y",
|
|
SRECT_HORIZONTAL = "SRECT_HORIZONTAL",
|
|
SRECT_VERTICAL = "SRECT_VERTICAL",
|
|
ANCHORED_POS = "ANCHORED_POS",
|
|
ANCHORED_POSX = "ANCHORED_POSX",
|
|
ANCHORED_POSY = "ANCHORED_POSY",
|
|
ALPHA_ALL = "ALPHA_ALL", --动态添加CanvasGroup设置透明度,也可以自己在prefab里添加然后调用TweenLite.UiAnimationType.ALPHA
|
|
FILLAMOUNT = "FILLAMOUNT",
|
|
DELAY = "DALAY", --延迟
|
|
}
|
|
|
|
TweenLite.moving_info_list = {} --当前正在缓动的列表
|
|
TweenLite.moving_info_list_delay = {} -- 保存正在更新的过程中添加进来的对象 本次更新完以后才会添加到moving_info_list里 避免更新过程中触发rehash产生影响
|
|
TweenLite.curr_info_index = 0
|
|
TweenLite.is_updating = false --是否正在更新
|
|
|
|
--[[
|
|
参数
|
|
parent_wnd:父容器 继承baseclass的父容器 用来判断是否已经被删除
|
|
anim_wnd:缓动对象
|
|
tweentype:缓动类型
|
|
endValue:结束值
|
|
AnimaTime:缓动时间(s)
|
|
anim_end_func:结束调用方法
|
|
tween_type:缓动类型 默认线性
|
|
]]
|
|
function TweenLite.to(parent_wnd, anim_wnd, tweentype, endValue, AnimaTime, anim_end_func, tween_type, loop)
|
|
if not anim_wnd then
|
|
return
|
|
end
|
|
local startvalue=0
|
|
if tweentype == TweenLite.UiAnimationType.POS then
|
|
startvalue = anim_wnd.localPosition
|
|
elseif tweentype == TweenLite.UiAnimationType.POSX then
|
|
startvalue = GetLocalPositionX(anim_wnd)
|
|
elseif tweentype == TweenLite.UiAnimationType.POSY then
|
|
startvalue = GetLocalPositionY(anim_wnd)
|
|
elseif tweentype == TweenLite.UiAnimationType.ALPHA then
|
|
startvalue = anim_wnd.alpha
|
|
elseif tweentype == TweenLite.UiAnimationType.ALPHA_OLD then
|
|
startvalue = GetAlpha(anim_wnd)
|
|
elseif tweentype == TweenLite.UiAnimationType.WIDTH then
|
|
startvalue = GetSizeDeltaX(anim_wnd)
|
|
elseif tweentype == TweenLite.UiAnimationType.HEIGHT then
|
|
startvalue = GetSizeDeltaY(anim_wnd)
|
|
elseif tweentype == TweenLite.UiAnimationType.ROTATION then
|
|
startvalue = anim_wnd.eulerAngles.z
|
|
elseif tweentype == TweenLite.UiAnimationType.ROTATION_Y then
|
|
startvalue = anim_wnd.eulerAngles.y
|
|
-- elseif tweentype == TweenLite.UiAnimationType.CANVAS_POSY then
|
|
-- startvalue=anim_wnd:GetVector2(ScrollViewProperty.CanvasPosition).y
|
|
-- elseif tweentype == TweenLite.UiAnimationType.CANVAS_POSX then
|
|
-- startvalue=anim_wnd:GetVector2(ScrollViewProperty.CanvasPosition).x
|
|
elseif tweentype == TweenLite.UiAnimationType.SCALE then
|
|
startvalue = anim_wnd.localScale
|
|
elseif tweentype == TweenLite.UiAnimationType.SRECT_HORIZONTAL then
|
|
startvalue = anim_wnd.horizontalNormalizedPosition
|
|
elseif tweentype == TweenLite.UiAnimationType.SRECT_VERTICAL then
|
|
startvalue = anim_wnd.verticalNormalizePosition
|
|
elseif tweentype == TweenLite.UiAnimationType.ANCHORED_POS then
|
|
startvalue = anim_wnd.anchoredPosition
|
|
elseif tweentype == TweenLite.UiAnimationType.ANCHORED_POSX then
|
|
startvalue = anim_wnd.anchoredPosition.x
|
|
elseif tweentype == TweenLite.UiAnimationType.ANCHORED_POSY then
|
|
startvalue = anim_wnd.anchoredPosition.y
|
|
elseif tweentype == TweenLite.UiAnimationType.FILLAMOUNT then
|
|
startvalue = anim_wnd:GetComponent("Image").fillAmount
|
|
elseif tweentype == TweenLite.UiAnimationType.ALPHA_ALL then
|
|
--添加一个CanvasGroup组件
|
|
local component = anim_wnd:GetComponent("CanvasGroup")
|
|
if not component then
|
|
component = anim_wnd:AddComponent(typeof(UnityEngine.CanvasGroup))
|
|
end
|
|
startvalue = component.alpha
|
|
elseif tweentype == TweenLite.UiAnimationType.DELAY then
|
|
end
|
|
local tid = TweenLite.AddMovingItem(parent_wnd, anim_wnd, tweentype, startvalue, endValue, AnimaTime, anim_end_func, tween_type, loop)
|
|
|
|
if TweenLite.delayfun_timer == nil then
|
|
local function delayfun()
|
|
TweenLite.Update()
|
|
end
|
|
TweenLite.delayfun_timer = GlobalTimerQuest:AddPeriodQuest(delayfun, 0.02, -1)
|
|
end
|
|
return tid
|
|
end
|
|
|
|
function TweenLite.setMovingInfo(v,progress)
|
|
if not v or v.parent_wnd._use_delete_method or IsNull(v.anim_wnd) then
|
|
return true
|
|
end
|
|
|
|
local curr_value = v.startvalue + (v.endValue - v.startvalue) * progress
|
|
if v.tweentype==TweenLite.UiAnimationType.POS then
|
|
-- v.anim_wnd.localPosition = curr_value
|
|
SetLocalPosition(v.anim_wnd, curr_value.x, curr_value.y , curr_value.z)
|
|
elseif v.tweentype==TweenLite.UiAnimationType.POSX then
|
|
-- local vect = Vector3(curr_value,v.anim_wnd.localPosition.y, v.anim_wnd.localPosition.z)
|
|
-- v.anim_wnd.localPosition = vect
|
|
SetLocalPositionX(v.anim_wnd, curr_value)
|
|
elseif v.tweentype==TweenLite.UiAnimationType.POSY then
|
|
-- local vect = Vector3(v.anim_wnd.localPosition.x,curr_value, v.anim_wnd.localPosition.z)
|
|
-- v.anim_wnd.localPosition = vect
|
|
SetLocalPositionY(v.anim_wnd, curr_value)
|
|
elseif v.tweentype==TweenLite.UiAnimationType.ALPHA then
|
|
v.anim_wnd.alpha = curr_value
|
|
elseif v.tweentype==TweenLite.UiAnimationType.ALPHA_OLD then
|
|
SetAlpha(v.anim_wnd,curr_value)
|
|
elseif v.tweentype==TweenLite.UiAnimationType.WIDTH then
|
|
SetSizeDeltaX(v.anim_wnd, curr_value)
|
|
-- v.anim_wnd.sizeDelta = Vector2(curr_value,v.anim_wnd.sizeDelta.y)
|
|
elseif v.tweentype==TweenLite.UiAnimationType.HEIGHT then
|
|
SetSizeDeltaY(v.anim_wnd, curr_value)
|
|
-- v.anim_wnd.sizeDelta = Vector2(v.anim_wnd.sizeDelta.x,curr_value)
|
|
elseif v.tweentype == TweenLite.UiAnimationType.ROTATION then
|
|
v.anim_wnd.localRotation = Quaternion.Euler(0,0,curr_value)
|
|
elseif v.tweentype == TweenLite.UiAnimationType.ROTATION_Y then
|
|
v.anim_wnd.localRotation = Quaternion.Euler(0,curr_value,0)
|
|
elseif v.tweentype == TweenLite.UiAnimationType.FILLAMOUNT then
|
|
v.anim_wnd:GetComponent("Image").fillAmount = curr_value
|
|
-- elseif v.tweentype==TweenLite.UiAnimationType.CANVAS_POSY then
|
|
-- anim_wnd:SetVectorR(ScrollViewProperty.CanvasPosition, pass_time)
|
|
-- elseif v.tweentype==TweenLite.UiAnimationType.CANVAS_POSX then
|
|
-- anim_wnd:SetVectorL(ScrollViewProperty.CanvasPosition, pass_time)
|
|
elseif v.tweentype == TweenLite.UiAnimationType.SCALE then
|
|
-- v.anim_wnd.localScale = curr_value
|
|
SetLocalScale(v.anim_wnd, curr_value.x, curr_value.y)
|
|
elseif v.tweentype == TweenLite.UiAnimationType.SRECT_HORIZONTAL then
|
|
v.anim_wnd.horizontalNormalizedPosition = curr_value
|
|
elseif v.tweentype == TweenLite.UiAnimationType.SRECT_VERTICAL then
|
|
v.anim_wnd.verticalNormalizePosition = curr_value
|
|
elseif v.tweentype==TweenLite.UiAnimationType.ANCHORED_POS and v.anim_wnd.anchoredPosition then
|
|
v.anim_wnd.anchoredPosition = curr_value
|
|
elseif v.tweentype==TweenLite.UiAnimationType.ANCHORED_POSX and v.anim_wnd.anchoredPosition then
|
|
local vect = Vector2(curr_value,v.anim_wnd.anchoredPosition.y)
|
|
v.anim_wnd.anchoredPosition = vect
|
|
elseif v.tweentype==TweenLite.UiAnimationType.ANCHORED_POSY and v.anim_wnd.anchoredPosition then
|
|
local vect = Vector2(v.anim_wnd.anchoredPosition.x, curr_value)
|
|
v.anim_wnd.anchoredPosition = vect
|
|
elseif v.tweentype==TweenLite.UiAnimationType.ALPHA_ALL then
|
|
local component = v.anim_wnd:GetComponent("CanvasGroup")
|
|
component.alpha = curr_value
|
|
elseif v.tweentype==TweenLite.UiAnimationType.DELAY then
|
|
end
|
|
return false
|
|
end
|
|
|
|
function TweenLite.AddMovingItem(parent_wnd, anim_wnd, tweentype, startvalue, endValue, AnimaTime, anim_end_func, tween_type, loop)
|
|
local info = {parent_wnd = parent_wnd, anim_wnd = anim_wnd, tweentype = tweentype, startvalue = startvalue, endValue = endValue, AnimaTime = AnimaTime,
|
|
anim_end_func = anim_end_func, tween_func = tween_type and TweenFunc[tween_type] or TweenFunc[TweenFunc.LINEAR], startTime = Status.NowTime, loop = loop or false}
|
|
TweenLite.curr_info_index = TweenLite.curr_info_index + 1
|
|
if TweenLite.is_updating == false then
|
|
TweenLite.moving_info_list[TweenLite.curr_info_index] = info
|
|
else
|
|
TweenLite.moving_info_list_delay[TweenLite.curr_info_index] = info
|
|
end
|
|
return TweenLite.curr_info_index
|
|
end
|
|
|
|
function TweenLite.Update()
|
|
-- if G_DEBUG_STOP_ACTION then
|
|
-- return
|
|
-- end
|
|
TweenLite.is_updating = true
|
|
local delete_list = {} --更新完后再删除列表 避免更新过程中触发rehash产生影响
|
|
for k, v in pairs(TweenLite.moving_info_list) do
|
|
local usetime = Status.NowTime - v.startTime
|
|
local need_delete = false
|
|
if v.tween_func then
|
|
--经过时间
|
|
local ratio = math_min(usetime / v.AnimaTime,1)
|
|
local progress = v.tween_func(ratio)
|
|
need_delete = TweenLite.setMovingInfo(v,progress)
|
|
end
|
|
local timeout = false
|
|
if usetime >= v.AnimaTime then
|
|
if v.loop then
|
|
v.startTime = Status.NowTime
|
|
else
|
|
timeout = true
|
|
end
|
|
end
|
|
if need_delete or timeout then
|
|
--结束回调
|
|
if not need_delete and v.anim_end_func ~= nil then
|
|
v.anim_end_func()
|
|
end
|
|
table_insert(delete_list,k)
|
|
end
|
|
end
|
|
TweenLite.is_updating = false
|
|
|
|
for i = 1,#delete_list do
|
|
TweenLite.moving_info_list[delete_list[i]] = nil
|
|
end
|
|
for k, v in pairs(TweenLite.moving_info_list_delay) do
|
|
v.startTime = Status.NowTime
|
|
TweenLite.moving_info_list[k] = v
|
|
end
|
|
TweenLite.moving_info_list_delay = {}
|
|
|
|
if IsTableEmpty(TweenLite.moving_info_list) then
|
|
if TweenLite.delayfun_timer then
|
|
GlobalTimerQuest:CancelQuest(TweenLite.delayfun_timer)
|
|
TweenLite.delayfun_timer = nil
|
|
-- print("GlobalTimerQuest:CancelQuest TweenLite.delayfun_timer")
|
|
end
|
|
end
|
|
end
|
|
|
|
function TweenLite.Stop(id)
|
|
if not id then return end
|
|
TweenLite.moving_info_list[id] = nil
|
|
TweenLite.moving_info_list_delay[id] = nil
|
|
end
|