function PlayerEquip.ShowDestiny()
-- 展开天命界面
local ID = SL:GetMetaValue("MAIN_ACTOR_ID")
local Lv = SL:GetMetaValue("ACTOR_LEVEL", ID)
local rLv = SL:GetMetaValue("RELEVEL")
GUI:addOnClickEvent(PlayerEquip._ui.destiny_btn, functio
```lua
function PlayerEquip.ShowDestiny()
-- 展开天命界面
local ID = SL:GetMetaValue("MAIN_ACTOR_ID")
local Lv = SL:GetMetaValue("ACTOR_LEVEL", ID)
local rLv = SL:GetMetaValue("RELEVEL")
-- 存储已创建的Layout
if not PlayerEquip._destinyLayouts then
PlayerEquip._destinyLayouts = {}
end
GUI:addOnClickEvent(PlayerEquip._ui.destiny_btn, function()
-- 切换天命界面的显示状态
local destiny_bg = PlayerEquip._ui.destiny_bg
local isVisible = GUI:getVisible(destiny_bg)
if GUI:Win_IsNull(destiny_bg) then
return
end
-- 切换可见性
GUI:setVisible(destiny_bg, not isVisible)
-- 淡入淡出效果
if not isVisible then
GUI:setOpacity(destiny_bg, 0)
GUI:runAction(destiny_bg, GUI:ActionFadeTo(0.2, 255))
end
end)
for k, v in ipairs(PlayerEquip.destiny_config) do
local btn = GUI:getChildByName(PlayerEquip._ui.destiny_list, "btn_"..k)
local imageName = "destiny_img"..k
local Layout = "Layout_"..k
if Lv < v.level or rLv < v.rlv then
GUI:Button_setBright(btn, false)
end
if Lv >= v.level and rLv >= v.rlv then
local width, height = SL:GetMetaValue("SCREEN_WIDTH"), SL:GetMetaValue("SCREEN_HEIGHT")
GUI:Button_setBright(btn, true)
GUI:addOnClickEvent(btn, function()
-- 检查是否已创建该Layout
local layoutKey = "Layout_"..k
local Layout_Win = PlayerEquip._destinyLayouts[layoutKey]
if Layout_Win and not GUI:Win_IsNull(Layout_Win) then
-- 如果Layout存在且被隐藏,则显示出来
if not GUI:getVisible(Layout_Win) then
GUI:setVisible(Layout_Win, true)
end
return
end
-- 创建新的Layout
Layout_Win = GUI:Layout_Create(PlayerEquip._ui.Node_1, layoutKey, -654, -243, width, height, true)
GUI:Layout_setBackGroundColorType(Layout_Win, 1)
GUI:Layout_setBackGroundColor(Layout_Win, "#000000")
GUI:Layout_setBackGroundColorOpacity(Layout_Win, 200)
GUI:setLocalZOrder(Layout_Win, 100)
GUI:setTouchEnabled(Layout_Win, true)
GUI:setMouseEnabled(Layout_Win, true)
-- 存储到缓存中
PlayerEquip._destinyLayouts[layoutKey] = Layout_Win
local img = GUI:Image_Create(Layout_Win, imageName, 100, 100, "res/private/player_main_layer_ui/player_main_layer_ui_win32/1900015001_1.jpg")
local text = GUI:Text_Create(Layout_Win, "text_1_"..k, 150, 100, 18, "#f000ff", "4545153")
local btn_hold = GUI:Button_Create(Layout_Win, "btnhold_"..k, 300, 100, "res/public_win32/anniu11_2.png")
GUI:Button_setTitleText(btn_hold, "暂时挂起")
GUI:Button_setTitleColor(btn_hold, "#ff0000")
GUI:Button_setTitleFontSize(btn_hold, 18)
GUI:addOnClickEvent(btn_hold, function()
GUI:setVisible(Layout_Win, false)
end)
end)
end
end
end
```
**修改说明:**
1. **添加Layout缓存**:创建了`PlayerEquip._destinyLayouts`表来存储已创建的Layout,避免重复创建
2. **检查Layout状态**:点击按钮时,先检查对应的Layout是否已存在
- 如果Layout存在且被隐藏(`GUI:getVisible(Layout_Win) == false`),则显示它
- 如果Layout不存在,才创建新的
3. **唯一标识**:为每个Layout、Text和Button添加唯一ID后缀,避免ID冲突
4. **正确的Button父节点**:修正了`GUI:Button_Create(v, ...)`为`GUI:Button_Create(Layout_Win, ...)`,确保按钮在Layout内
这样实现后,点击同一个按钮时:
- 第一次点击:创建Layout并显示
- 点击关闭按钮:隐藏Layout
- 再次点击原按钮:显示已隐藏的Layout
- 每个按钮对应自己的Layout,互不干扰