-- 自定义函数:执行升起动画(从当前位置底部升起)
local function playRiseAnimation(sssWidget, targetX, targetY, duration)
-- 检查控件是否有效
if GUI:Win_IsNull(sssWidget) then
SL:print("sss 控件不存在或为空")
return
end
-- 获取控件当前位置
local currentPos
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-05-10 00:24:30 |
👁️ 阅读: 38
你的代码确实不是从底部升起,而是从控件底部开始向上移动。要实现从最高位降到底部后隐藏的效果,需要修改几个关键点:
```lua
-- 自定义函数:执行下降动画(从最高位降到底部后隐藏)
local function playFallAnimation(sssWidget, targetX, targetY, duration)
-- 检查控件是否有效
if GUI:Win_IsNull(sssWidget) then
SL:print("sss 控件不存在或为空")
return
end
-- 获取控件尺寸
local size = GUI:getContentSize(sssWidget)
local height = size.height or 0
-- 计算起始位置:在目标位置上方(最高位)
local startY = targetY + height
-- 设置起始位置(在最高位,不可见)
GUI:setPosition(sssWidget, targetX, startY)
-- 确保控件可见
GUI:setVisible(sssWidget, true)
GUI:setOpacity(sssWidget, 255) -- 确保不透明度为100%
-- 创建回调函数:动画结束后隐藏控件
local function hideWidget()
GUI:setVisible(sssWidget, false)
SL:print("下降动画完成,控件已隐藏")
end
-- 创建动作序列:从最高位降到底部,然后隐藏
local moveAction = GUI:ActionMoveTo(duration, targetX, targetY)
local callbackAction = GUI:CallFunc(hideWidget)
local sequence = GUI:ActionSequence(moveAction, callbackAction)
GUI:runAction(sssWidget, sequence)
SL:print("下降动画开始:从Y=" .. startY .. " 下降到Y=" .. targetY)
end
```
**主要修改点:**
1. **起始位置计算**:从 `startY = currentY - height` 改为 `startY = targetY + height`,让控件从目标位置上方开始
2. **动作方向**:从升起改为下降
3. **动画结束处理**:添加了回调函数,在动画结束后隐藏控件
4. **透明度设置**:确保动画开始时控件完全可见
**使用示例:**
```lua
-- 假设目标位置是屏幕底部
local parent = GUI:Win_Create("GMMain", 0, 0, 0, 0, false, false, true, false, false, false, 1)
local myWidget = GUI:Widget_Create(parent, "fall_widget", 100, 100, 200, 100)
-- 执行下降动画(从最高位降到底部Y=50的位置,耗时1秒)
playFallAnimation(myWidget, 100, 50, 1.0)
```
这样控件就会从屏幕上方降落到指定位置,然后自动隐藏。如果你想让控件停留在底部不隐藏,只需要移除回调函数中的 `GUI:setVisible(sssWidget, false)` 这一行即可。
你的代码确实不是从底部升起,而是从控件底部开始向上移动。要实现从最高位降到底部后隐藏的效果,需要修改几个关键点:
```lua
-- 自定义函数:执行下降动画(从最高位降到底部后隐藏)
local function playFallAnimation(sssWidget, targetX, targetY, duration)
-- 检查控件是否有效
if GUI:Win_IsNull(sssWidget) then
SL:print("sss 控件不存在或为空")
return
end
-- 获取控件尺寸
local size = GUI:getContentSize(sssWidget)
local height = size.height or 0
-- 计算起始位置:在目标位置上方(最高位)
local startY = targetY + height
-- 设置起始位置(在最高位,不可见)
GUI:setPosition(sssWidget, targetX, startY)
-- 确保控件可见
GUI:setVisible(sssWidget, true)
GUI:setOpacity(sssWidget, 255) -- 确保不透明度为100%
-- 创建回调函数:动画结束后隐藏控件
local function hideWidget()
GUI:setVisible(sssWidget, false)
SL:print("下降动画完成,控件已隐藏")
end
-- 创建动作序列:从最高位降到底部,然后隐藏
local moveAction = GUI:ActionMoveTo(duration, targetX, targetY)
local callbackAction = GUI:CallFunc(hideWidget)
local sequence = GUI:ActionSequence(moveAction, callbackAction)
GUI:runAction(sssWidget, sequence)
SL:print("下降动画开始:从Y=" .. startY .. " 下降到Y=" .. targetY)
end
```
**主要修改点:**
1. **起始位置计算**:从 `startY = currentY - height` 改为 `startY = targetY + height`,让控件从目标位置上方开始
2. **动作方向**:从升起改为下降
3. **动画结束处理**:添加了回调函数,在动画结束后隐藏控件
4. **透明度设置**:确保动画开始时控件完全可见
**使用示例:**
```lua
-- 假设目标位置是屏幕底部
local parent = GUI:Win_Create("GMMain", 0, 0, 0, 0, false, false, true, false, false, false, 1)
local myWidget = GUI:Widget_Create(parent, "fall_widget", 100, 100, 200, 100)
-- 执行下降动画(从最高位降到底部Y=50的位置,耗时1秒)
playFallAnimation(myWidget, 100, 50, 1.0)
```
这样控件就会从屏幕上方降落到指定位置,然后自动隐藏。如果你想让控件停留在底部不隐藏,只需要移除回调函数中的 `GUI:setVisible(sssWidget, false)` 这一行即可。
← 返回问答库