local function zhuanpan(msgID, msgData)
local screenWidth = SL:GetMetaValue("SCREEN_WIDTH", 0)
local screenHeight = SL:GetMetaValue("SCREEN_HEIGHT", 0)
local parent = GUI:Win_Create("zhuanpan", 0, 0, 0, 0, false, false, true, false, false
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-20 14:25:20 |
👁️ 阅读: 10
看了你的代码,主要问题是翻转动画没有实现翻页效果,而且翻转逻辑可以优化。根据浮生梦老师前端课程内容,我来帮你改进:
```lua
local function zhuanpan(msgID, msgData)
local screenWidth = SL:GetMetaValue("SCREEN_WIDTH", 0)
local screenHeight = SL:GetMetaValue("SCREEN_HEIGHT", 0)
local parent = GUI:Win_Create("zhuanpan", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 创建布局容器
local layout = GUI:Layout_Create(parent, "layout", screenWidth/2, screenHeight/2, 900, 500)
if layout then
GUI:setAnchorPoint(layout, 0.5, 0.5)
GUI:setTouchEnabled(layout, true)
end
-- 加载界面文件
GUI:LoadExport(layout,"zhuanpan")
local ui = GUI:ui_delegate(layout)
GUI:setCascadeOpacityEnabled(layout, true)
GUI:setOpacity(layout, 0)
GUI:runAction(layout, GUI:ActionFadeIn(2))
-- 存储按钮的正面图片路径
local frontImages = {
"res/01/010012.jpg",
"res/01/010013.jpg",
"res/01/010014.jpg",
"res/01/010015.jpg",
"res/01/010016.jpg",
"res/01/010017.jpg",
"res/01/010018.jpg",
"res/01/010019.jpg",
"res/01/010020.jpg",
"res/01/010021.jpg"
}
-- 改进的卡牌翻转动画函数
local function flipCardAnimation(backBtn, index)
-- 获取背面按钮的位置和大小
local backPos = GUI:getPosition(backBtn)
local backSize = GUI:getContentSize(backBtn)
-- 创建正面图片(一开始隐藏)
local frontImage = GUI:Image_Create(layout, "front_"..index, backPos.x, backPos.y, frontImages[index])
GUI:setAnchorPoint(frontImage, 0.5, 0.5)
GUI:setContentSize(frontImage, backSize.width, backSize.height)
GUI:setVisible(frontImage, false)
-- 设置背面卡牌的锚点为中心
GUI:setAnchorPoint(backBtn, 0.5, 0.5)
-- 第一步:背面缩小到0(翻页效果)
local backAction = GUI:ActionSequence(
GUI:ActionScaleTo(0.2, 0, 1), -- X轴缩放到0
GUI:ActionCallFunc(function()
-- 背面隐藏,正面显示
GUI:setVisible(backBtn, false)
GUI:setVisible(frontImage, true)
GUI:setScaleX(frontImage, 0) -- 正面从0开始
end)
)
-- 第二步:正面从0放大到1(翻页效果)
local frontAction = GUI:ActionSequence(
GUI:ActionDelayTime(0.1), -- 稍微延迟
GUI:ActionScaleTo(0.2, 1, 1) -- X轴放大到1
)
-- 执行动画
GUI:runAction(backBtn, backAction)
GUI:runAction(frontImage, frontAction)
SL:print("卡牌"..index.."开始翻转动画!")
end
-- 点击开始按钮,创建所有卡牌
GUI:addOnClickEvent(ui.Button_1, function()
for i = 1, 10 do
local pos = GUI:getPosition(ui['Image_'..i])
local size = GUI:getContentSize(ui['Image_'..i])
-- 移除原始图片
GUI:removeFromParent(ui['Image_'..i])
-- 创建背面按钮(使用你指定的背景图)
local beimian = GUI:Button_Create(layout, "bei"..i, pos.x, pos.y, "res/public_win32/1900000610.png")
GUI:setContentSize(beimian, size.width, size.height)
GUI:setVisible(beimian, true)
GUI:setAnchorPoint(beimian, 0.5, 0.5)
-- 设置按钮标题
GUI:Button_setTitleText(beimian, "卡牌"..i)
-- 为每个按钮绑定翻转动画
GUI:addOnClickEvent(beimian, function()
SL:print('点击了卡牌'..i)
flipCardAnimation(beimian, i)
end)
end
-- 移除开始按钮
GUI:removeFromParent(ui.Button_1)
end)
end
```
**主要改进点:**
1. **使用ActionSequence实现翻页效果**:通过`ActionScaleTo`控制X轴的缩放,从1到0再到1,实现真正的翻页动画
2. **简化动画逻辑**:用动作序列替代schedule,代码更清晰
3. **优化性能**:避免使用schedule循环,减少资源占用
4. **增加视觉反馈**:添加按钮标题,让用户知道点击的是哪张卡牌
**关键函数说明:**
- `GUI:ActionSequence()`:创建动作序列,按顺序执行多个动作
- `GUI:ActionScaleTo(time, scaleX, scaleY)`:在指定时间内缩放到指定比例
- `GUI:ActionDelayTime(time)`:延迟执行
- `GUI:ActionCallFunc(callback)`:执行回调函数
这样修改后,卡牌翻转会有明显的翻页效果,用户体验更好!
← 返回问答库