AutoUsePop = {}
AutoUsePop._remainTimeStr = "(%s)" -- 剩余时间展示格式
function AutoUsePop.main(data)
local parent = GUI:Attach_Parent()
local id = data and data.id or 0
local node = GUI:Node_Create(parent, "Node_" .. id, 0, 0)
GUI:LoadExpor
要将整个控件设置成可移动,需要在代码中添加触摸事件处理。根据浮生梦老师前端课程内容,可以使用`GUI:addOnTouchEvent`函数来实现控件的拖动功能。
以下是修改后的代码,添加了拖动功能:
```lua
AutoUsePop = {}
AutoUsePop._remainTimeStr = "(%s)" -- 剩余时间展示格式
function AutoUsePop.main(data)
local parent = GUI:Attach_Parent()
local id = data and data.id or 0
local node = GUI:Node_Create(parent, "Node_" .. id, 0, 0)
GUI:LoadExport(node, "auto_use_pop")
GUI:setTag(node, id)
AutoUsePop._data = data
AutoUsePop._Node = node
AutoUsePop._ui = GUI:ui_delegate(node)
-- 显示适配
local posY = 140
local baseOffX = 350
local screenH = SL:GetMetaValue("SCREEN_HEIGHT")
local PPopUI = AutoUsePop._ui["PPopUI"]
if SL:GetMetaValue("WINPLAYMODE") then
GUI:setMouseEnabled(PPopUI, true)
baseOffX = 220
posY = screenH - 330 - GUI:getContentSize(PPopUI).height
end
local notch, rect = SL:GetMetaValue("NOTCH_PHONE_INFO")
if notch then
baseOffX = baseOffX + rect.x
end
local screenW = SL:GetMetaValue("SCREEN_WIDTH")
GUI:setPosition(AutoUsePop._Node, screenW - baseOffX, posY)
GUI:setVisible(PPopUI, true)
-- 添加拖动功能
AutoUsePop:addDragFunction()
AutoUsePop.InitUI()
end
-- 添加拖动功能的方法
function AutoUsePop:addDragFunction()
if not self._ui or not self._ui["PPopUI"] then
return
end
local PPopUI = self._ui["PPopUI"]
local startPos = {x = 0, y = 0}
local nodeStartPos = {x = 0, y = 0}
-- 设置触摸事件实现拖动
GUI:addOnTouchEvent(PPopUI, function(eventType, x, y)
if eventType == 0 then -- 触摸开始
startPos.x = x
startPos.y = y
local nodePos = GUI:getPosition(self._Node)
nodeStartPos.x = nodePos.x
nodeStartPos.y = nodePos.y
return true
elseif eventType == 1 then -- 触摸移动
local offsetX = x - startPos.x
local offsetY = y - startPos.y
local newX = nodeStartPos.x + offsetX
local newY = nodeStartPos.y + offsetY
-- 限制在屏幕范围内
local screenW = SL:GetMetaValue("SCREEN_WIDTH")
local screenH = SL:GetMetaValue("SCREEN_HEIGHT")
local size = GUI:getContentSize(self._Node)
newX = math.max(0, math.min(newX, screenW - size.width))
newY = math.max(0, math.min(newY, screenH - size.height))
GUI:setPosition(self._Node, newX, newY)
return true
elseif eventType == 2 then -- 触摸结束
-- 触摸结束后的处理,可以保存位置等
return true
end
end)
-- 设置控件可以触摸
GUI:setMouseEnabled(PPopUI, true)
end
function AutoUsePop.InitUI()
if not AutoUsePop._data then
return
end
local id = AutoUsePop._data.id
local item = AutoUsePop._data.item
local isHero = AutoUsePop._data.isHero
local isBook = AutoUsePop._data.skillBook
-- 英雄
if isHero then
GUI:Text_setString(AutoUsePop._ui.TextTitle, "快捷使用(英雄)")
end
GUI:Text_setString(AutoUsePop._ui.TextName, item.Name)
if SL:GetMetaValue("GAME_DATA", "AutoUseScrollWidth") then
local scrollWidth = tonumber(SL:GetMetaValue("GAME_DATA", "AutoUseScrollWidth")) or 140
GUI:removeAllChildren(AutoUsePop._ui.TextName)
GUI:Text_setString(AutoUsePop._ui.TextName, "")
local label = GUI:ScrollText_Create(AutoUsePop._ui.TextName, "scrollText", 0, 0, scrollWidth,
SL:GetMetaValue("GAME_DATA", "DEFAULT_FONT_SIZE"), "#FFFFFF", item.Name)
GUI:setAnchorPoint(label, 0.5, 0.5)
end
-- 技能书
if isBook then
GUI:Button_setTitleText(AutoUsePop._ui.BtnUse, "使用")
end
-- 道具图标
GUI:removeAllChildren(AutoUsePop._ui.ItemNode)
local item = GUI:ItemShow_Create(AutoUsePop._ui.ItemNode, "ItemShow", 0, 0, {
look = true,
index = item.Index,
itemData = item
})
GUI:setAnchorPoint(item, 0.5, 0.5)
end
```
主要改动:
1. 添加了`addDragFunction`方法,用于为控件添加拖动功能
2. 在`main`函数中调用`AutoUsePop:addDragFunction()`启用拖动
3. 使用`GUI:addOnTouchEvent`监听触摸事件,实现拖动逻辑
4. 添加了屏幕边界限制,防止控件被拖出屏幕外
5. 确保控件设置为可触摸状态`GUI:setMouseEnabled(PPopUI, true)`
触摸事件的三个状态:
- `eventType = 0`:触摸开始,记录起始位置
- `eventType = 1`:触摸移动,计算偏移量并更新位置
- `eventType = 2`:触摸结束,可在此处添加结束后的处理逻辑
这样用户就可以通过鼠标或触摸拖动整个AutoUsePop控件了。