PGRData/Resources/Scripts/XUi/XUiCommon/XScrollView/XScrollFlow.lua
2022-12-26 14:06:01 +05:30

93 lines
No EOL
2.9 KiB
Lua

XScrollFlowHelper = {}
local EDGE_SCALE = 0.35
local ScrollFlowList = {}
function XScrollFlowHelper.GetScrollFlow(uiName)
return ScrollFlowList[uiName]
end
XScrollFlow = XClass(XScrollView, "XScrollFlow")
function XScrollFlow:Ctor(rootUi, ui, scrollItems, paramsObj)
self.paramsObj = paramsObj
ScrollFlowList[ui.name] = self
end
function XScrollFlow:AddKeys(animationCurve, keys)
for i = 1, #keys do
local key = keys[i]
local keyframe = CS.UnityEngine.Keyframe()
for k, v in pairs(key) do
keyframe[k] = v
end
animationCurve:AddKey(keyframe)
end
end
function XScrollFlow:InitAnimationCurve()
local AnimationCurve = CS.UnityEngine.AnimationCurve
self.PositionCurve = AnimationCurve()
self.ScaleCurve = AnimationCurve()
self.AlphaCurve = AnimationCurve()
self:AddKeys(self.PositionCurve, XScrollConfig.POSITION_KEY_FRAMES)
self:AddKeys(self.ScaleCurve, XScrollConfig.SCALE_KEY_FRAMES)
self:AddKeys(self.AlphaCurve, XScrollConfig.ALPHA_KEY_FRAMES)
end
function XScrollFlow:OnDrag(eventData)
self.AddVector = eventData.position - self.StartPoint
local addValue = eventData.delta.x * 1 / self.ContentSize.x
if self.Direction == XScrollConfig.VERTICAL then
addValue = eventData.delta.y * 1 / self.ContentSize.y
end
local count = #self.ScrollItems
if self.ScrollItems[1].CurveValue > (1 - EDGE_SCALE) or self.ScrollItems[count].CurveValue < EDGE_SCALE then
addValue = 0
end
for i = 1, #self.ScrollItems do
self.ScrollItems[i]:OnDrag(addValue)
end
-- self:AdjustScrollItems(addValue)
end
function XScrollFlow:OnEndDrag()
local offset = 0
local count = #self.ScrollItems
if self.ScrollItems[1].CurveValue > 0.5 then
offset = 0.5 - self.ScrollItems[1].CurveValue
elseif self.ScrollItems[count].CurveValue < 0.5 then
offset = 0.5 - self.ScrollItems[count].CurveValue
else
for i = 1, count do
if self.ScrollItems[i].CurveValue >= self.MinBorder then -- 获取偏移量
offset = self.OffsetValue / 2 + self.ScrollItems[i].CurveValue
offset = self.OffsetValue / 2 - (offset + self.OffsetValue / 2) % self.OffsetValue
break
end
end
end
self.AddVector = CS.UnityEngine.Vector3.zero
self:Anim2End(offset)
end
function XScrollFlow:Evaluate(curveValue, transform)
local position = transform and transform.localPosition or CS.UnityEngine.Vector3.zero
if self.Direction == XScrollConfig.HORIZONTAL then
position.x = self.PositionCurve:Evaluate(curveValue) * self.ContentSize.x - self.ContentSize.x / 2
else
position.y = self.PositionCurve:Evaluate(curveValue) * self.ContentSize.y - self.ContentSize.y / 2
end
local alpha = self.AlphaCurve:Evaluate(curveValue)
local scale = self.ScaleCurve:Evaluate(curveValue)
return position, alpha, scale
end