local benyuanzhili = {}
function benyuanzhili.main(param1, param2, param3, param4)
lib:Require(param1, function(state)
if state then
if param1 then
benyuanzhili.parent = lib:openwin(param1, nil, true, param4)
根据浮生梦老师前端课程内容,你的代码存在几个关键问题导致按钮位置没有按预期移动:
1. **ListView创建位置错误**:子按钮的ListView应该创建在父节点上,而不是直接挂在根UI
2. **缺少坐标计算**:没有根据展开状态动态调整其他按钮的位置
3. **布局逻辑不完整**:需要记录每个主按钮的原始位置
以下是修正后的关键代码部分:
```lua
-- 在upmain函数中修改主按钮创建部分
-- 记录每个主按钮的原始Y坐标
benyuanzhili.btn_original_y = benyuanzhili.btn_original_y or {}
-- 创建6个主按钮
for nameid = 1, 6 do
local magic_id = nameid
if not benyuanzhili.magic_btns[magic_id] then
-- 计算按钮位置(每个按钮间隔60像素)
local btn_y = (magic_id - 1) * 60
local btn = GUI:Button_Create(ui.magic_list_view, "magic_btn_"..magic_id, 0, btn_y,
"res/yidalu/benyuanzhili/" .. magic_id .. "_1.png")
benyuanzhili.magic_btns[magic_id] = btn
benyuanzhili.btn_original_y[magic_id] = btn_y -- 记录原始位置
GUI:addOnClickEvent(btn, function()
benyuanzhili.click_magic_btn(magic_id)
end)
-- 创建子按钮的ListView(作为浮层,不参与布局)
local listView = GUI:ListView_Create(ui.magic_list_view, "ListView_"..magic_id, 0, btn_y + 60, 300, 100, 1)
GUI:setVisible(listView, false)
benyuanzhili.childListViewList[magic_id] = listView
end
end
```
```lua
-- 修改click_magic_btn函数
function benyuanzhili.click_magic_btn(magic_id)
local ui = benyuanzhili.parent._ui
-- 隐藏旧按钮的子菜单
if benyuanzhili.click_magic_id then
local oldID = benyuanzhili.click_magic_id
local oldBtn = benyuanzhili.magic_btns[oldID]
if oldBtn then
GUI:Button_loadTextureNormal(oldBtn, "res/yidalu/benyuanzhili/" .. oldID .. "_1.png")
GUI:setTouchEnabled(oldBtn, true)
end
local oldLV = benyuanzhili.childListViewList[oldID]
if oldLV then
GUI:setVisible(oldLV, false)
GUI:removeAllChildren(oldLV)
end
end
-- 设置当前按钮为选中状态
benyuanzhili.click_magic_id = magic_id
local curBtn = benyuanzhili.magic_btns[magic_id]
if curBtn then
GUI:Button_loadTextureNormal(curBtn, "res/yidalu/benyuanzhili/" .. magic_id .. "_2.png")
GUI:setTouchEnabled(curBtn, false)
end
-- 显示子按钮浮层
local lv = benyuanzhili.childListViewList[magic_id]
if lv then
GUI:setVisible(lv, true)
-- 创建6个子按钮
for i = 1, 6 do
local child = GUI:Button_Create(lv, "child_"..magic_id.."_"..i, 0, (i-1)*50,
"res/yidalu/benyuanzhili/10_1.png")
GUI:ListView_pushBackCustomItem(lv, child)
end
end
-- ==============================
-- ✅ 关键:调整其他按钮的位置
-- ==============================
for i = 1, 6 do
local btn = benyuanzhili.magic_btns[i]
if btn and i ~= magic_id then
if i > magic_id then
-- 下面的按钮下移(因为有子菜单展开)
local new_y = benyuanzhili.btn_original_y[i] + 100 -- 子菜单高度
GUI:setPosition(btn, 0, new_y)
else
-- 上面的按钮保持原位置
GUI:setPosition(btn, 0, benyuanzhili.btn_original_y[i])
end
end
end
end
```
**核心修改点:**
1. **记录原始位置**:`benyuanzhili.btn_original_y[magic_id] = btn_y`
2. **动态调整位置**:在点击时,根据当前展开的按钮,调整其他按钮的Y坐标
3. **子菜单作为浮层**:ListView创建在根节点上,不占用主按钮的布局空间
**函数说明:**
- `GUI:setPosition(widget, x, y)`:设置控件坐标
- `GUI:Button_loadTextureNormal(btn, path)`:设置按钮正常状态图片
- `GUI:ListView_pushBackCustomItem(listView, item)`:向ListView添加子项
这样修改后,点击主按钮一时,按钮二到六会下移;点击主按钮二时,按钮一恢复原位,按钮三到六下移,符合你的需求。