90 lines
2.9 KiB
Lua
90 lines
2.9 KiB
Lua
local GMFloatingIcon = class("GMFloatingIcon", LuaComponent)
|
|
|
|
function GMFloatingIcon:init()
|
|
self.baseObject:addDragListener(function(eventType, x, y)
|
|
self:onGrag(eventType, x, y)
|
|
end)
|
|
self:adsorbent(true)
|
|
end
|
|
|
|
function GMFloatingIcon:show()
|
|
self.baseObject:setActive(true)
|
|
self:adsorbent(true)
|
|
end
|
|
|
|
function GMFloatingIcon:hide()
|
|
if self.aniSequence then
|
|
self.aniSequence:Kill()
|
|
self.aniSequence = nil
|
|
end
|
|
self.baseObject:setActive(false)
|
|
end
|
|
|
|
function GMFloatingIcon:adsorbent(immediately, delay)
|
|
local posX = self.baseObject:getTransform().anchoredPosition.x
|
|
local posY = self.baseObject:getTransform().anchoredPosition.y
|
|
local width = GConst.UI_SCREEN_WIDTH
|
|
local height = GConst.UI_SCREEN_HEIGHT
|
|
local distanceBottom = posY + height/2
|
|
local distanceTop = height - distanceBottom
|
|
local distanceLeft = posX + width/2
|
|
local distanceRight = width - distanceLeft
|
|
local min = math.min(distanceBottom, distanceTop, distanceLeft, distanceRight)
|
|
local x, y, duration = width/2, posY, min / 1000 -- 默认向右吸附
|
|
if distanceLeft == min then -- 离左边最近
|
|
x, y = -width/2, posY
|
|
elseif distanceTop == min then -- 离上边最近
|
|
x, y = posX, height/2
|
|
elseif distanceBottom == min then-- 离下边最近
|
|
x, y = posX, -height/2
|
|
end
|
|
if self.aniSequence then
|
|
self.aniSequence:Kill()
|
|
self.aniSequence = nil
|
|
end
|
|
if immediately then
|
|
self.baseObject:setAnchoredPosition(x, y)
|
|
else
|
|
self:playAdsorbentAni(x, y, duration, delay)
|
|
end
|
|
end
|
|
|
|
function GMFloatingIcon:playAdsorbentAni(x, y, duration, delay)
|
|
self.aniSequence = DOTweenManager:createSeqWithIntId()
|
|
if delay then
|
|
self.aniSequence:AppendInterval(delay)
|
|
end
|
|
self.aniSequence:Append(self.baseObject:getTransform():DOAnchorPos(BF.Vector2(x, y), duration))
|
|
end
|
|
|
|
function GMFloatingIcon:onGrag(eventType, x, y)
|
|
if eventType == GConst.TOUCH_EVENT.DOWN then
|
|
if self.aniSequence then
|
|
self.aniSequence:Kill()
|
|
self.aniSequence = nil
|
|
end
|
|
elseif eventType == GConst.TOUCH_EVENT.DRAG then
|
|
local uiCamera = UIManager:getUICameraComponent()
|
|
local worldPosition = uiCamera:ScreenToWorldPoint(BF.Vector2(x, y))
|
|
local convertPosition = UIManager:getMainCanvas():getTransform():InverseTransformPoint(worldPosition)
|
|
local x = convertPosition.x
|
|
local y = convertPosition.y
|
|
if x > GConst.UI_SCREEN_WIDTH/2 then
|
|
x = GConst.UI_SCREEN_WIDTH/2
|
|
elseif x < -GConst.UI_SCREEN_WIDTH/2 then
|
|
x = -GConst.UI_SCREEN_WIDTH/2
|
|
end
|
|
if y > GConst.UI_SCREEN_HEIGHT/2 then
|
|
y = GConst.UI_SCREEN_HEIGHT/2
|
|
elseif y < -GConst.UI_SCREEN_HEIGHT/2 then
|
|
y = -GConst.UI_SCREEN_HEIGHT/2
|
|
end
|
|
self.baseObject:setAnchoredPosition(x, y)
|
|
elseif eventType == GConst.TOUCH_EVENT.UP_INSIDE then
|
|
ModuleManager.DevToolManager:showDevListUI()
|
|
elseif eventType == GConst.TOUCH_EVENT.DRAG_CANCEL_UP then
|
|
self:adsorbent(false, 1)
|
|
end
|
|
end
|
|
|
|
return GMFloatingIcon |