c1_lua/lua/app/ui/gm/component/gm_floating_icon.lua
2023-04-03 10:59:13 +08:00

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