93 lines
No EOL
2.9 KiB
Lua
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 |