local function pushDescItem(desc, descTag)
if not desc or not ItemTips.contentPanel then
return
end
local movePosY = 0
if desc and next(desc) then
local contentSz = GUI:getContentSize(ItemTips.contentPanel)
for
这个 `pushDescItem` 函数是浮生梦老师前端课程中用于处理道具提示界面描述项布局的核心函数。我来帮你详细解析一下它的工作原理和关键点:
**函数功能**:
这是一个动态创建和排列道具描述内容(文字、图片、间隔线)的函数,主要用在道具Tips界面中。
**参数说明**:
- `desc`: 描述数据表,包含要显示的各种描述项
- `descTag`: 描述标签,用于特殊处理(比如标签为1时处理顶部描述)
**核心处理逻辑**:
1. **有效性检查**:首先检查`desc`和`ItemTips.contentPanel`是否存在
```lua
if not desc or not ItemTips.contentPanel then
return
end
```
2. **顶部描述特殊处理**:当`descTag == 1`时,处理需要显示在顶部的描述项
```lua
if descTag == 1 then
if v.y and v.y ~= 0 then
isadd = false
v.y = contentSz.height - v.y -- 坐标转换
v.isTop = true
table.insert(topDesY, v) -- 加入顶部描述表
end
end
```
3. **创建间隔线**:当描述项有`newLine`标记时创建间隔面板
```lua
if v.newLine then
local lineH = v.height or 0
lineH = lineH > 0 and lineH or _DefaultSpace
local linePanel = ItemTips.CreateIntervalPanel(ItemTips.contentPanel, lineH, true)
GUI:setPosition(linePanel, v.x or 0, v.y or 0)
ItemTips.PushItem(ItemTips.contentPanel, linePanel)
```
4. **创建富文本**:处理文本描述项
```lua
elseif v.text then
rich_att_num = rich_att_num + 1
local textSize = _setFontSize or _DefaultFSize
if v.fontsize and v.fontsize > 0 then
textSize = v.fontsize
end
local rich_att = GUI:RichTextFCOLOR_Create(ItemTips.contentPanel,
string.format("rich_att_%s", rich_att_num),
math.floor(v.x or 0),
math.floor(v.y or 0),
v.text,
ItemTips._isItem and 420 or (_TotalWidth - 20),
textSize,
"#FFFFFF",
vspace, nil, fontPath)
ItemTips.PushItem(ItemTips.contentPanel, rich_att)
```
5. **创建图片**:处理图片描述项
```lua
elseif v.res then
desc_img_num = desc_img_num + 1
local img = ItemTips.GetNodeImage(ItemTips.contentPanel, v, desc_img_num)
if img then
ItemTips.PushItem(ItemTips.contentPanel, img)
-- PC和移动端适配处理
if v.isSFX and SL:GetMetaValue("WINPLAYMODE") then
local imgSz = GUI:getContentSize(img)
local posX = GUI:getPositionX(img)
local posY = GUI:getPositionY(img)
GUI:setPosition(img, math.floor(posX), math.floor(posY - imgSz.height / 2 + movePosY))
end
end
```
**关键技巧**:
- 使用`GUI:getContentSize()`获取容器尺寸进行坐标计算
- 通过`ItemTips.PushItem()`统一管理添加的控件
- 支持PC和移动端的显示适配
- 自动处理字体大小、颜色等样式
这个函数展示了996引擎中如何动态构建复杂UI的典型模式,通过数据驱动的方式灵活布局各种描述元素。