跳转至

exEasyUI 扩展库

一、概述

  • exEasyUI 是基于 LuatOS 打造的简化 UI 组件库,内聚了组件管理、渲染与触摸事件分发能力。
  • 主要组件:Button、Label、ProgressBar、MessageBox、Picture、CheckBox、Window。
  • 用 exEasyUI 以更少代码快速搭建可量产的触控界面,内置触摸/渲染/组件与示例。
  • 提供 LuatOS PC 模拟器快速验证效果,无需等待烧录。
  • 更多组件持续更新中。

二、组件效果及演示代码

2.1 Window(窗口容器)+Label(文本)静态方式

2.1.1 演示效果

默认使用12号中文字体
显示效果
可设置颜色
使用gtfont字库可设置字体大小可设置字体大小
黑色/白色,跟随主题
Hello exEasyUI
Hello exEasyUI
Hello exEasyUI

2.1.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为黑色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建Label(文本)组件,在(20,20)位置显示"hello exEasyUI",命名为lbl
    lbl = ui.Label({ x = 20, y = 20, text = "hello exEasyUI"})

    -- 将组件lbl并注册到page1
    page1:add(lbl)

    -- 将page1注册到ui
    ui.add(page1)
    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30) 
    end
end

sys.taskInit(exEasyUI_demo)

sys.run()

2.1.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.1Window+Label\

2.2 Window(窗口容器)+Label(文本)+ 循环刷新

2.2.1 演示效果

默认使用12号中文字体认
文本内容动态变化
可设置颜色
使用gtfont字库可设置字体大小
黑色/白色,跟随主题
时间:19:30:20

时间:19:30:20
时间:19:30:20

2.2.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建Label(文本)组件,在(20,20)位置显示"hello exEasyUI",命名为lbl
    lbl = ui.Label({ x = 20, y = 20, text = "hello exEasyUI"})

    -- 将组件lbl并注册到page1
    page1:add(lbl)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 更新时间给文本组件lbl
        lbl:setText("时间:"..os.date("%Y-%m-%d %H:%M:%S"))           
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.2.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.2Window+Label\

2.3 Window(窗口容器)+ Button(按钮)文本模式

2.3.1 演示效果


默认状态

按下反馈
默认按钮


自定义命名


2.3.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个Button(按钮)文本模式,显示在(20.20)位置,命名为btn1
    local btn1 = ui.Button({ x = 20, y = 20})
    page1:add(btn1)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30) 
    end
end

sys.taskInit(exEasyUI_demo)

sys.run()

2.3.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.3Window+Button\

2.4 Window(窗口容器)+ Button(按钮)图标模式

2.4.1 演示效果

设置默认图标


设置点击后图标

2.4.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个Button(按钮)图标模式,显示在(20.20)位置,命名为btn2,点击切换图片
    local btn2 = ui.Button({x = 20, y = 20, w = 64, h = 64,
        toggle = true,                  -- 启用切换模式
        src = "/luadb/4.jpg",           -- 默认图片
        src_toggled = "/luadb/5.jpg",   -- 切换状态时的图片
    })
    page1:add(btn2)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.4.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.4Window+Button\

2.5 Window(窗口容器)+ ProgressBar(进度条)静态方式

2.5.1 演示效果

默认

2.5.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个ProgressBar进度条,显示在(20.20)位置,命名为pb
    local pb = ui.ProgressBar({ x = 20, y = 20, w = 280, h = 26})
    -- 添加控件到page1
    page1:add(pb)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.5.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.5Window+ProgressBar\

2.6 Window(窗口容器)+ ProgressBar(进度条)动态方式

2.6.1 演示效果

默认

更改进度

自定义内容

2.6.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local direction = 1 
local current = 0

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个ProgressBar进度条,显示在(20.20)位置,命名为pb
    local pb = ui.ProgressBar({ x = 20, y = 20, w = 280, h = 26})
    -- 添加控件到page1
    page1:add(pb)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        pb:setProgress(current)
        current = current + direction
        if current >= 100 then
            direction = -1
        elseif current <= 0 then
            direction = 1
        end  
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.6.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.5Window+ProgressBar\

2.7 Window(窗口容器)+ MessageBox(消息面板)

2.7.1 演示效果

标题消息按钮

富文本消息


2.7.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个MessageBox(消息面板),启用自动换行,显示在(20.20)位置,命名为box
    local box = ui.MessageBox({ x = 20, y = 20, wordWrap = true,title = "通知", message = "愿你前路浩荡,未来可期.愿你保持热爱,奔赴山海。愿你所有的努力都不被辜负,最终活成自己最喜欢的模样.加油!"})
    page1:add(box)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.7.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.6Window+MessageBox\

2.8 Window(窗口容器)+ CheckBox(复选框)

2.8.1 演示效果

默认状态
选中状态
选中后执行程序


可选

2.8.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个CheckBox(复选框),显示在(20.20)位置,命名为cb
    local cb = ui.CheckBox({ x = 20, y = 20, text = "Check me"})
    page1:add(cb)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.8.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.7Window+CheckBox\

2.9 Window(窗口容器)+ Picture(图片轮播)单图模式

2.9.1 演示效果

未设置图片
设置了图片


2.9.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个 Picture(图片轮播)组件,显示在(20.20)位置,命名为pic
    local pic = ui.Picture({ x = 20, y = 20, sources = {"/luadb/1.jpg"}})
    -- 添加控件pic到page1
    page1:add(pic)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.9.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.8Window+Picture\

2.10 Window(窗口容器)+ Picture(图片轮播)轮播模式

2.10.1 演示效果

**列表内图片,每张按设置之间循环显示**



2.10.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)

    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建Window(窗口容器),设置背景为白色,命名为page1
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 创建一个 Picture(图片轮播)组件,按顺序每张图片显示1.5s,显示在(20.20)位置,命名为pic
    local pic = ui.Picture({ x = 20, y = 20, sources = {"/luadb/1.jpg", "/luadb/2.jpg", "/luadb/3.jpg"}, autoplay = true, interval = 1500})
    -- 添加控件pic到page1
    page1:add(pic)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        -- 清除显示
        ui.clear()
        -- 刷新显示
        ui.render()
        -- 等待30ms
        sys.wait(30)
    end

end

sys.taskInit(exEasyUI_demo)

sys.run()

2.10.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.9Window+Picture\

2.11 全部控件

2.11.1 演示效果



2.11.2 演示代码

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

local function exEasyUI_demo()
    sys.wait(500)
    -- 依赖 screen_data_table.lua 内的 lcdargs/touch 参数
    -- 显示触摸初始化
    ui.hw.init({})

    -- 设置主题
    ui.init({ theme = "light" })

    -- 创建设置背景为白色
    local page1 = ui.Window({ backgroundColor = ui.COLOR_WHITE })

    -- 1、创建一个高度为1000像素的页面,移动超过8个像素,页面跟随
    page1:enableScroll({ direction = "vertical", contentHeight = 1000, threshold = 8 })

    -- 2、 ProgressBar进度条
    local progress = 0
    local pb = ui.ProgressBar({ x = 20, y = 170, w = 280, h = 26, progress = progress})
    -- 添加控件到page1
    page1:add(pb)

    -- 3、 MessageBox(消息框/面板)
    local box = ui.MessageBox({ x = 20, y = 160, wordWrap = true, buttons = {"接受祝福"},title = "祝福", message = "愿你前路浩荡,未来可期.愿你保持热爱,奔赴山海。愿你所有的努力都不被辜负,最终活成自己最喜欢的模样.加油!"})
    page1:add(box)
    page1:remove(box)

    -- 4、 Button
    local btn1 = ui.Button({ x = 180, y = 76, onClick = function(self)
        progress = progress + 10  pb:setProgress(progress) pb:setText("下载中"..progress.."%")
        if progress == 100 then page1:add(box) progress = 0 end
    end })
    page1:add(btn1)

    -- 5、 ToolButton,点击切换图片,可选执行程序
    local btn2 = ui.Button({x = 10, y = 64, w = 64, h = 64,
        src = "/luadb/4.jpg",           -- 默认图片
        src_toggled = "/luadb/5.jpg",   -- 切换状态时的图片
        toggle = true,                  -- 启用切换模式
    })
    page1:add(btn2)

    -- 6、创建一个三张图片轮播的控件,1.5s切换一张
    local pic = ui.Picture({ x = 20, y = 310,
    sources = {"/luadb/1.jpg", "/luadb/2.jpg", "/luadb/3.jpg"}, autoplay = true, interval = 1500 })
    -- 添加控件pic到page1
    page1:add(pic)

    -- 7、 CheckBox
    local cb = ui.CheckBox({ x = 20, y = 240, text = "Check me", checked = false, onChange = function (v)
        log.info("demo", "checkbox", v)
    end })
    page1:add(cb)

    -- 8、 Label 目前显示的是日期和时间
    lbl = ui.Label({ x = 20, y = 20, text = ""})
    page1:add(lbl)

    -- 将page1注册到ui
    ui.add(page1)

    -- 显示主循环
    while true do
        ui.clear()
        -- 更新时间给文本组件
        lbl:setText("时间:"..os.date("%Y-%m-%d %H:%M:%S"))
        ui.render()
        sys.wait(30)
    end
end
sys.taskInit(exEasyUI_demo)
sys.run()

2.11.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.10_all\

2.12 Window(窗口容器)+ 水平滑动

2.12.1 演示效果


2.12.2 演示代码

-- exEasyUI v1.6.0
local ui = require("exeasyui")

sys = require("sys")

sys.taskInit(function()
    sys.wait(500)
    ui.hw.init({})
    ui.init({ theme = "light" })

    local win = ui.Window({ backgroundColor = 0xFFFF })
    -- 启用横向滚动,将两页内容并排布置到一个宽画布
    local pageW, pageH = 320, 480
    local totalW = pageW * 2
    win:enableScroll({ direction = "horizontal", contentWidth = totalW, threshold = 8, pagingEnabled = true, pageWidth = pageW })

    local function makeGrid(offsetX, labelPrefix)
        local cols, rows = 3, 3
        local bw, bh = 90, 80
        local mx, my = 20 + offsetX, 60
        local gapx, gapy = 10, 10
        local n = 1
        for r = 0, rows - 1 do
            for c = 0, cols - 1 do
                local x = mx + c * (bw + gapx)
                local y = my + r * (bh + gapy)
                local btn = ui.Button({ x = x, y = y, w = bw, h = bh, text = string.format("%s-%d", labelPrefix, n) })
                win:add(btn)
                n = n + 1
            end
        end
    end

    -- 左页与右页
    makeGrid(0,  "P1")
    makeGrid(pageW, "P2")

    ui.add(win)

    while true do
        ui.clear()
        ui.render()
        sys.wait(30)
    end
end)

sys.run()

2.12.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.11Horizontal_slidin_page\

2.13 Window(窗口容器)+ 纵向滑动

2.13.1 演示效果


2.13.2 演示代码

-- exEasyUI v1.6.0
local ui = require("exeasyui")

sys = require("sys")

sys.taskInit(function()
    sys.wait(500)
    -- 依赖 screen_data_table.lua 内的 lcdargs/touch 参数
    ui.hw.init({})
    ui.init({ theme = "light" })

    local win = ui.Window({ backgroundColor = 0xFFFF })
    -- 启用纵向分页滚动,将两页内容上下排布到一个高画布
    local pageW, pageH = 320, 480
    local totalH = pageH * 2
    win:enableScroll({ direction = "vertical", contentHeight = totalH, threshold = 8, pagingEnabled = true, pageHeight = pageH })

    local function makeButtons(offsetY, labelPrefix)
        -- 改为竖直等间距排列:1列3行,水平居中
        local cols, rows = 1, 3
        local bw, bh = 90, 80
        local mx = math.floor((pageW - bw) / 2) -- 居中
        local gap = math.floor((pageH - rows * bh) / (rows + 1))
        if gap < 8 then gap = 8 end
        local n = 1
        for r = 0, rows - 1 do
            local x = mx
            local y = offsetY + gap + r * (bh + gap)
            local btn = ui.Button({ x = x, y = y, w = bw, h = bh, text = string.format("%s-%d", labelPrefix, n) })
            win:add(btn)
            n = n + 1
        end
    end

    -- 上页与下页:每页 3 个按钮,共 6 个
    makeButtons(0,      "P1")
    makeButtons(pageH,  "P2")

    ui.add(win)

    while true do
        ui.clear()
        ui.render()
        sys.wait(30)
    end
end)

sys.run()

2.13.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.12Vertical_sliding_page\

2.14 页面切换

2.14.1 演示效果






2.14.2 演示代码

代码有多个文件夹,详情可见 demo 文件

2.14.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.13Switch_page\

2.15 矢量字体

2.15.1 演示效果


2.15.2 演示代码

PROJECT = "exEasyUI_gfont_demo"
VERSION = "1.0.0"

sys = require("sys")

-- exEasyUI v1.6.0
local ui = require("exeasyui")

sys.taskInit(function()
    sys.wait(500)
    -- 打开iic供电
    gpio.setup(141, 1, gpio.PULLUP)
    -- 启用 gtfont 字体后端
    ui.hw.init({ lcd_sn = "AirLCD_1001", tp = "gt911", font = { type = "gtfont", spi = { id = 1, cs = 12, clock = 20*1000*1000 }, gray = false, size = 32 } })
    ui.init({ theme = "light" })

    local win = ui.Window({ backgroundColor = ui.COLOR_WHITE })
    ui.add(win)

    local text1 = ui.Label({ x = 10, y = 20, text = "ABCDEFG", color = ui.COLOR_BLACK })
    local text2 = ui.Label({ x = 10, y = 100, text = "abcdefg", color = ui.COLOR_RED })
    local text3 = ui.Label({ x = 10, y = 180, text = "1234567", color = ui.COLOR_GREEN })
    local text4 = ui.Label({ x = 10, y = 260, text = "!@#$%^&*", color = ui.COLOR_BLUE })
    local text5 = ui.Label({ x = 10, y = 340, text = "Hello GTFont", color = ui.COLOR_ORANGE })
    local text6 = ui.Label({ x = 10, y = 420, text = "中英混排 ABC 合宙", color = ui.COLOR_PINK })

    ui.add(text1)
    ui.add(text2)
    ui.add(text3)
    ui.add(text4)
    ui.add(text5)
    ui.add(text6)

    while true do
        ui.clear()
        ui.render()
        sys.wait(200)
    end
end)

sys.run()

2.15.3 PC 模拟器快捷命令

.\luatos-lua.exe .\lib\ .\demo\2.14gtfont\

三、运行环境说明

3.1 演示文件说明

  1. cmd 启动 LuatOS PC 模拟器的快捷键;
  2. luatos-lua.exe,LuatOS PC 模拟器;
  3. lib 文件夹,exEasyUI 库文件,无需修改;
  4. 各 demo 文件夹,演示的 demo 文件,其中 main.lua 为主程序;

3.2 演示步骤

  1. 双击 cmd 快捷键运行 LuatOS PC 模拟器;
  2. 把代码下方 PC 模拟器快捷命令复制到 LuatOS PC 模拟器里面

3、按回车运行 LuatOS PC 模拟器和 demo 代码

4、退出 pc 模拟器运行的代码,使用快捷键 ctrl+c

5、查看 pc 模拟器历史运行的 PC 模拟器快捷命令,使用快捷键 ↑

3.3 快捷命令汇总

序号
运行demo文件
PC模拟器快捷命令
1
2.1Window+Label文本
.\luatos-lua.exe .\lib\ .\demo\2.1Window+Label\
2
2.2Window+Label+循环刷新
.\luatos-lua.exe .\lib\ .\demo\2.2Window+Label\
3
2.3Window+Button文本模式
.\luatos-lua.exe .\lib\ .\demo\2.3Window+Button\
4
2.4Window+Button图标模式
.\luatos-lua.exe .\lib\ .\demo\2.4Window+Button\
5
2.5Window+ProgressBar静态
.\luatos-lua.exe .\lib\ .\demo\2.5Window+ProgressBar\
6
2.6Window+ProgressBar动态
.\luatos-lua.exe .\lib\ .\demo\2.6Window+ProgressBar\
7
2.7Window+MessageBox
.\luatos-lua.exe .\lib\ .\demo\2.7Window+MessageBox\
8
2.8Window+CheckBox
.\luatos-lua.exe .\lib\ .\demo\2.8Window+CheckBox\
9
2.9Window+Picture单图模式
.\luatos-lua.exe .\lib\ .\demo\2.9Window+Picture\
10
2.10Window+Picture轮播模式
.\luatos-lua.exe .\lib\ .\demo\2.10Window+Picture\
11
2.11Allcomponent全部控组
.\luatos-lua.exe .\lib\ .\demo\2.11Allcomponent\
12
2.12Horizontal_slidin_page横向滑动
.\luatos-lua.exe .\lib\ .\demo\2.12Horizontal_slidin_page\
13
2.13Vertical_sliding_page纵向滑动
.\luatos-lua.exe .\lib\ .\demo\2.13Vertical_sliding_page\
14
2.14Switch_page页面切换
.\luatos-lua.exe .\lib\ .\demo\2.14Switch_page\
15
2.15gtfont矢量字体
.\luatos-lua.exe .\lib\ .\demo\2.15gtfont\

四、客户可能的疑问

1、PC 模拟器实现的功能,真实模组能否实现;

答:提供的 demo 根据实际接线配置好引脚,能够直接烧录到支持 lcd 库的设备上进行运行,需要显示中文的则要使用支持 12 号中文字体的型号;

2、PC 模拟器上体现的速度和真实设备有区别吗?

答:pc 性能更强刷新率会稳定一些,soc 上图片比较多时,刷新率会降低,实现效果相同;

五、核心示例(滑动窗口从上到下展示各组件)

以下示例演示:创建一个窗口,开启纵向滚动,将各个组件的最小可用示例纵向排布,滑动浏览。

PROJECT = "exEasyUI_demo"
VERSION = "1.0.0"

sys = require("sys")
local ui = require("exeasyui")

sys.taskInit(function()
    sys.wait(500)
    -- 依赖 screen_data_table.lua 内的 lcdargs/touch 参数
    ui.hw.init({})
    ui.init({ theme = "light" })

    local win = ui.Window({ backgroundColor = ui.COLOR_WHITE })
    -- 内容高度较大,启用纵向滚动
    win:enableScroll({ direction = "vertical", contentHeight = 1000, threshold = 8 })

    local y = 20
    local function place(h)
        local cur = y; y = y + h + 16; return cur
    end

    -- 1) Button
    local btn = ui.Button({ x = 20, y = place(44), w = 280, h = 44, text = "Button", onClick = function(self)
        log.info("demo", "button clicked")
    end })
    win:add(btn)

    -- 2) Toggle按钮(v1.6.0:Button支持toggle功能)
    local tb = ui.Button({ x = 20, y = place(64), w = 64, h = 64, 
        src = "/luadb/icon.jpg", toggle = true, 
        onToggle = function(t) log.info("demo", "toggled", t) end 
    })
    win:add(tb)

    -- 3) CheckBox
    local cb = ui.CheckBox({ x = 20, y = place(24), text = "Check me", checked = false, onChange = function(v)
        log.info("demo", "checkbox", v)
    end })
    win:add(cb)

    -- 4) Label(v1.6.0:支持自动换行)
    local lbl = ui.Label({ x = 20, y = place(60), w = 280, wordWrap = true,
        text = "This is a long text that will wrap automatically within the specified width." })
    win:add(lbl)

    -- 5) Picture(示例:无实际图片时会显示占位框)
    local pic = ui.Picture({ x = 20, y = place(120), w = 160, h = 120, autoplay = false, src = "/luadb/sample.jpg" })
    win:add(pic)

    -- 6) MessageBox(作为静态面板展示)
    local box = ui.MessageBox({ x = 20, y = place(120), w = 280, h = 120, title = "MessageBox", message = "Info Panel", buttons = {"OK"}, onResult = function(r)
        log.info("demo", "msgbox", r)
    end })
    win:add(box)

    -- 7) ProgressBar
    local pb = ui.ProgressBar({ x = 20, y = place(26), w = 280, h = 26, progress = 35, text = "35%" })
    win:add(pb)

    ui.add(win)

    while true do
        ui.clear()
        ui.render()
        sys.wait(30)
    end
end)

sys.run()

六、常量详解

6.1 基础颜色常量

6.2 Windows 11 风格颜色(v1.6.0 新增)

Light 模式

Dark 模式

以上颜色常量均由 ui 导出,可直接通过 ui.COLOR_WHITE 等方式使用。 Window 和 Button 组件在 light 主题下默认使用 Windows 11 Light 配色,dark 主题下使用 Dark 配色。

七、组件 API 详解

本节对每个组件提供:功能说明、构造参数、方法、事件、示例。

7.1 Button(按钮)

功能

多功能按钮组件,支持文本按钮、图片按钮、Toggle 切换按钮(v1.6.0 合并 ToolButton 功能)。

构造ui.Button(args)

参数args

{
    x = , y = ,
    -- 参数含义:左上角坐标;
    -- 数据类型:number;
    -- 是否必选:可选,默认0;

    w = , h = ,
    -- 参数含义:宽/高;
    -- 数据类型:number;
    -- 是否必选:可选,默认 w=100, h=36;

    -- 文本模式参数
    text = ,
    -- 参数含义:按钮文字;
    -- 数据类型:string;
    -- 是否必选:可选,默认"Button";

    textSize = ,
    -- 参数含义:文字字号;
    -- 数据类型:number;
    -- 是否必选:可选;

    bgColor = , textColor = , borderColor = ,
    -- 参数含义:背景/文本/边框颜色;
    -- 数据类型:number(RGB565);
    -- 是否必选:可选,浅色主题默认Windows 11配色;

    -- 图片模式参数(v1.6.0新增)
    src = ,
    -- 参数含义:普通态图片路径;
    -- 数据类型:string;
    -- 是否必选:可选,有此参数时按钮显示为图片;
    -- 说明:v1.6.1起会检查文件是否存在,不存在时显示占位符并输出警告日志;

    src_pressed = ,
    -- 参数含义:按下态图片路径;
    -- 数据类型:string;
    -- 是否必选:可选;

    src_toggled = ,
    -- 参数含义:切换态图片路径(toggle=true时使用);
    -- 数据类型:string;
    -- 是否必选:可选;

    -- Toggle模式参数(v1.6.0新增)
    toggle = ,
    -- 参数含义:是否为Toggle切换按钮;
    -- 数据类型:boolean;
    -- 是否必选:可选,默认false;

    toggled = ,
    -- 参数含义:初始切换状态;
    -- 数据类型:boolean;
    -- 是否必选:可选,默认false;

    onToggle = ,
    -- 参数含义:切换回调;
    -- 数据类型:function(toggled, self);
    -- 是否必选:可选;

    onClick = 
    -- 参数含义:点击回调;
    -- 数据类型:function(self);
    -- 是否必选:可选;
}

方法

setText(newText)         -- 设置按钮文字

事件

SINGLE_TAP: 调用 onClick(self)

示例

-- 1. 文本按钮(使用默认配色)
local btn1 = ui.Button({
    x = 20, y = 40, w = 120, h = 44,
    text = "确定",
    onClick = function() log.info("btn", "clicked") end
})

-- 2. 图片按钮(有按下态)
local btn2 = ui.Button({
    x = 20, y = 100, w = 64, h = 64,
    src = "/luadb/icon.jpg",
    src_pressed = "/luadb/icon_pressed.jpg",
    onClick = function() log.info("img btn", "clicked") end
})

-- 3. Toggle按钮
local btn3 = ui.Button({
    x = 20, y = 180, w = 64, h = 64,
    src = "/luadb/off.jpg",
    src_toggled = "/luadb/on.jpg",
    toggle = true,
    onToggle = function(state)
        log.info("toggle", state and "ON" or "OFF")
    end
})

Button.setText

功能

设置按钮文字。

签名

Button:setText(newText)

参数

newText
-- 参数含义:新的按钮文本
-- 数据类型:string
-- 是否必选:是

返回值

示例

local b = ui.Button({ x = 20, y = 40, text = "原文" })
b:setText("确定")

7.2 CheckBox(复选框)

功能

布尔选择控件。

构造ui.CheckBox(args)

参数args

{
    x = , y = ,
    -- 参数含义:位置;
    -- 数据类型:number;

    boxSize = ,
    -- 参数含义:复选框边长;
    -- 数据类型:number;
    -- 是否必选:可选,默认16;

    text = ,
    -- 参数含义:右侧文本;
    -- 数据类型:string;

    checked = ,
    -- 参数含义:初始选中状态;
    -- 数据类型:boolean;
    -- 是否必选:可选,默认false;

    onChange = ,
    -- 参数含义:状态改变回调;
    -- 数据类型:function(checked);

    textColor = , borderColor = , bgColor = , tickColor = ,
    -- 参数含义:颜色(文本/边框/背景/选中块);
    -- 数据类型:number;
}

方法

setChecked(v)
toggle()

CheckBox.setChecked

功能

设置复选框选中状态。

签名

CheckBox:setChecked(v)

参数

v
-- 参数含义:目标选中状态
-- 数据类型:boolean
-- 是否必选:是

返回值

示例

local cb = ui.CheckBox({ x=20, y=160, text="启用" })
cb:setChecked(true)

CheckBox.toggle

功能

切换当前选中状态。

签名

CheckBox:toggle()

参数 / 返回值

示例

cb:toggle()

事件

SINGLE_TAP: 点击区域内部时切换并调用 onChange(checked)

示例

local cb = ui.CheckBox({ 
    x = 20, y = 160, text = "启用", 
    onChange = function(v) log.info("cb", v) end 
})

7.3 Label(文本标签)

功能

静态文本显示,支持自动换行(v1.6.0 新增)。

构造ui.Label(args)

参数args

{
    x = , y = ,
    -- 参数含义:位置;
    -- 数据类型:number;

    text = ,
    -- 参数含义:文本内容;
    -- 数据类型:string;

    w = ,
    -- 参数含义:最大宽度(v1.6.0);
    -- 数据类型:number;
    -- 是否必选:可选,未指定时自动计算;
    -- 说明:指定后,无换行时超出部分截断,有换行时在此宽度内换行;

    wordWrap = ,
    -- 参数含义:是否启用自动换行(v1.6.0);
    -- 数据类型:boolean;
    -- 是否必选:可选,默认false;
    -- 说明:启用后在w宽度内智能换行(英文按单词,中文按字符);

    color = ,
    -- 参数含义:文本颜色;
    -- 数据类型:number;
    -- 是否必选:可选,默认随主题;

    size = ,
    -- 参数含义:字号;
    -- 数据类型:number;
    -- 是否必选:可选;

    font = 
    -- 参数含义:自定义字体句柄(默认后端时生效);
    -- 数据类型:userdata;
}

方法

setText(t)
setSize(sz)

Label.setText

功能

设置文本内容。

签名

Label:setText(t)

参数

t
-- 参数含义:新文本
-- 数据类型:string
-- 是否必选:是

返回值

示例

local lbl = ui.Label({ x = 20, y = 200, text = "Hello" })
lbl:setText("World")

Label.setSize

功能

设置字号,并按需调整宽高。

签名

Label:setSize(sz)

参数

sz
-- 参数含义:字号
-- 数据类型:number
-- 是否必选:是

返回值

示例

lbl:setSize(20)

示例

-- 1. 基础文本
local lbl1 = ui.Label({ x = 20, y = 200, text = "Hello exEasyUI" })

-- 2. 文本截断(超出w则截断)
local lbl2 = ui.Label({ 
    x = 20, y = 230, w = 200,
    text = "这是一段很长的文本会被截断" 
})

-- 3. 自动换行(v1.6.0)
local lbl3 = ui.Label({ 
    x = 20, y = 260, w = 280, wordWrap = true,
    text = "This is a long text that demonstrates automatic word wrapping feature in exEasyUI v1.6.0."
})

7.4 Picture(图片/轮播)

功能

显示单图或多图轮播。v1.6.1 起,图片文件不存在时会显示占位符(灰色背景 + 白色边框 +X 叉)。

构造ui.Picture(args)

参数args

{
    x = , y = , w = , h = ,
    -- 参数含义:位置与尺寸;
    -- 数据类型:number;
    -- 说明:v1.6.1建议使用正方形或接近正方形尺寸以获得最佳占位符显示效果;

    src = ,
    -- 参数含义:单张图片路径;
    -- 数据类型:string;
    -- 说明:v1.6.1起会检查文件是否存在,不存在时显示占位符并输出警告日志;

    sources = ,
    -- 参数含义:多张图片路径列表;
    -- 数据类型:table,如 { "/luadb/a.jpg", "/luadb/b.jpg" };

    autoplay = ,
    -- 参数含义:是否自动轮播(sources 有多图时生效);
    -- 数据类型:boolean,默认false;

    interval = 
    -- 参数含义:轮播间隔(毫秒);
    -- 数据类型:number,默认1000;
}

方法

setSources(list)
next()
prev()
play()
pause()

Picture.setSources

功能

设置图片列表并重置索引。

签名

Picture:setSources(list)

参数

list
-- 参数含义:图片路径数组
-- 数据类型:table,如 {"/luadb/a.jpg", "/luadb/b.jpg"}

返回值

示例

pic:setSources({ "/luadb/1.jpg", "/luadb/2.jpg" })

Picture.next / Picture.prev

功能

切换到下一张 / 上一张(在 sources 存在时)。

签名

Picture:next()
Picture:prev()

参数 / 返回值

示例

pic:next()
pic:prev()

Picture.play / Picture.pause

功能

开启 / 暂停自动轮播。

签名

Picture:play()
Picture:pause()

参数 / 返回值

示例

pic:play()
sys.wait(2000)
pic:pause()

示例

-- 单图显示
local pic1 = ui.Picture({ 
    x = 20, y = 240, w = 120, h = 90,
    src = "/luadb/image.jpg" 
})

-- 自动轮播
local pic2 = ui.Picture({ 
    x = 20, y = 350, w = 120, h = 90,
    sources = {"/luadb/a.jpg", "/luadb/b.jpg"}, 
    autoplay = true 
})

7.5 MessageBox(消息框/面板)

功能

展示标题、内容与按钮组,支持消息自动换行(v1.6.0 新增),支持复用与动态更新(v1.6.1 新增)。

构造ui.MessageBox(args)

参数args

{
    x = , y = , w = , h = ,
    -- 参数含义:位置与尺寸;
    -- 数据类型:number;

    title = ,
    -- 参数含义:标题文本;
    -- 数据类型:string,默认"Info";

    message = ,
    -- 参数含义:内容文本;
    -- 数据类型:string;

    wordWrap = ,
    -- 参数含义:消息是否自动换行(v1.6.0);
    -- 数据类型:boolean;
    -- 是否必选:可选,默认true(v1.6.1起);
    -- 说明:启用后消息在固定高度内智能换行,超出部分截断;

    visible = ,
    -- 参数含义:初始是否可见(v1.6.1修复);
    -- 数据类型:boolean;
    -- 是否必选:可选,默认true;

    enabled = ,
    -- 参数含义:初始是否可交互(v1.6.1修复);
    -- 数据类型:boolean;
    -- 是否必选:可选,默认true;

    textSize = ,
    -- 参数含义:文本字号;
    -- 数据类型:number;
    -- 是否必选:可选;

    buttons = ,
    -- 参数含义:按钮文本数组;
    -- 数据类型:table,默认 {"OK"};
    -- 说明:可传入空数组 {} 创建无按钮的MessageBox;

    onResult = ,
    -- 参数含义:按钮点击回调;
    -- 数据类型:function(label);

    borderColor = , textColor = , bgColor = ,
    -- 参数含义:边框/文本/背景颜色;
    -- 数据类型:number;
}

方法

show()                   -- 显示MessageBox(v1.6.1新增)
hide()                   -- 隐藏MessageBox(v1.6.1新增)
setTitle(title)          -- 动态更新标题(v1.6.1新增)
setMessage(message)      -- 动态更新消息内容(v1.6.1新增)

事件

内部按钮 SINGLE_TAP: 调用 onResult(label)

MessageBox 子方法

MessageBox.show

功能

显示 MessageBox(设置 visible 和 enabled 为 true)。v1.6.1 新增,用于 MessageBox 复用。

签名

MessageBox:show()

参数 / 返回值

示例

msgbox:show()

MessageBox.hide

功能

隐藏 MessageBox(设置 visible 为 false)。v1.6.1 新增,用于 MessageBox 复用。

签名

MessageBox:hide()

参数 / 返回值

示例

msgbox:hide()

MessageBox.setTitle

功能

动态更新 MessageBox 标题。v1.6.1 新增。

签名

MessageBox:setTitle(title)

参数

title
-- 参数含义:新标题文本
-- 数据类型:string
-- 是否必选:是

返回值

示例

msgbox:setTitle("警告")

MessageBox.setMessage

功能

动态更新 MessageBox 消息内容。v1.6.1 新增,如启用了自动换行会自动重新计算行数。

签名

MessageBox:setMessage(message)

参数

message
-- 参数含义:新消息文本
-- 数据类型:string
-- 是否必选:是

返回值

示例

msgbox:setMessage("更新后的消息内容")

示例

-- 1. 简单提示
local box1 = ui.MessageBox({ 
    x = 20, y = 340, w = 280, h = 120,
    title = "提示", message = "操作成功", 
    buttons = {"确定"},
    onResult = function(r) log.info("msg", r) end 
})

-- 2. 长消息自动换行(v1.6.0,v1.6.1起默认开启)
local box2 = ui.MessageBox({ 
    x = 20, y = 340, w = 280, h = 160,
    title = "提示",
    message = "这是一段很长的提示消息,启用自动换行后会在固定宽度内智能分行显示,超出高度的部分会被截断。",
    buttons = {"知道了"}
})

-- 3. MessageBox复用(v1.6.1推荐方式)
-- 创建时设置为初始隐藏
local msgbox = ui.MessageBox({ 
    x = 20, y = 340, w = 280, h = 120,
    title = "提示", 
    message = "初始消息", 
    visible = false,  -- 初始隐藏
    buttons = {"确定"},
    onResult = function(r) 
        msgbox:hide()  -- 点击后隐藏而非禁用
    end 
})
win:add(msgbox)

-- 多次复用同一个MessageBox
local btn1 = ui.Button({ 
    x = 20, y = 40, w = 120, h = 44, 
    text = "显示消息1",
    onClick = function()
        msgbox:setTitle("通知")
        msgbox:setMessage("这是第一条消息")
        msgbox:show()
    end 
})

local btn2 = ui.Button({ 
    x = 160, y = 40, w = 120, h = 44, 
    text = "显示消息2",
    onClick = function()
        msgbox:setTitle("警告")
        msgbox:setMessage("这是第二条消息")
        msgbox:show()
    end 
})

-- 4. 无按钮MessageBox(信息面板)
local infoPanel = ui.MessageBox({ 
    x = 20, y = 480, w = 280, h = 100,
    title = "系统状态",
    message = "运行正常\n内存使用: 45%",
    buttons = {}  -- 无按钮
})

-- 5. 动态更新示例(如实时显示时间)
sys.taskInit(function()
    while true do
        local time = os.date("%H:%M:%S")
        msgbox:setMessage("当前时间: " .. time)
        sys.wait(1000)
    end
end)

7.6 ProgressBar(进度条)

功能

显示百分比进度,可附带文本。

构造ui.ProgressBar(args)

参数args

{
    x = , y = , w = , h = ,
    -- 参数含义:位置与尺寸;
    -- 数据类型:number;

    progress = ,
    -- 参数含义:进度百分比 0~100;
    -- 数据类型:number,默认0;

    text = , textSize = ,
    -- 参数含义:文本与字号;
    -- 数据类型:string/number;

    backgroundColor = , progressColor = , borderColor = , textColor = ,
    -- 参数含义:配色(背景/进度/边框/文本);
    -- 数据类型:number;

    showPercentage = 
    -- 参数含义:是否显示百分比文本;
    -- 数据类型:boolean,默认true;
}

方法

setProgress(v)
getProgress()
setText(text)

ProgressBar.setProgress

功能

设置进度百分比。

签名

ProgressBar:setProgress(v)

参数

v
-- 参数含义:目标进度 0~100
-- 数据类型:number
-- 是否必选:是

返回值

示例

pb:setProgress(75)

ProgressBar.getProgress

功能

获取当前进度值。

签名

ProgressBar:getProgress()

参数

返回值

number -- 当前进度 0~100

示例

local v = pb:getProgress()
log.info("pb", v)

ProgressBar.setText

功能

设置显示文本(可覆盖百分比显示)。

签名

ProgressBar:setText(text)

参数

text
-- 参数含义:文本内容
-- 数据类型:string
-- 是否必选:是

返回值

示例

pb:setText("下载中...")

示例

-- 基础进度条
local pb = ui.ProgressBar({ 
    x = 20, y = 480, w = 280, h = 26, 
    progress = 40 
})

-- 带自定义文本
local pb2 = ui.ProgressBar({ 
    x = 20, y = 520, w = 280, h = 26, 
    progress = 65, text = "下载中..." 
})

八、Window 使用模式说明

本节采用与上文一致的结构,分别介绍 Window 的创建与参数、子方法以及子页面(子窗口)使用方式。

8.1 Window(窗口容器)创建与参数

功能

窗口容器,用作页面根节点或子页面载体。支持背景色/背景图、子组件管理、滚动与分页、子页面导航等。

构造ui.Window(args)

参数args

{
    x = , y = ,
    -- 参数含义:窗口左上角坐标;
    -- 数据类型:number;
    -- 是否必选:可选,默认0;

    w = , h = ,
    -- 参数含义:窗口宽/高;
    -- 数据类型:number;
    -- 是否必选:可选,默认填满屏幕(lcd.getSize());

    backgroundImage = ,
    -- 参数含义:背景图片路径(.jpg);
    -- 数据类型:string;
    -- 是否必选:可选;

    backgroundColor = ,
    -- 参数含义:背景颜色(RGB565);
    -- 数据类型:number;
    -- 是否必选:可选,浅色主题默认Windows 11配色;

    visible = , enabled = ,
    -- 参数含义:可见/可交互;
    -- 数据类型:boolean;
    -- 是否必选:可选,默认 true;
}

示例

-- 使用默认配色(v1.6.0:浅色主题自动使用Windows 11配色)
local win = ui.Window()
ui.add(win)

8.2 Window 子方法

方法

add(child)                    -- 添加子组件
remove(child)                 -- 移除子组件
clear()                       -- 清空子组件

setBackgroundImage(path)      -- 设置背景图
setBackgroundColor(color)     -- 设置背景色(并清除背景图)

enableScroll(opts)            -- 启用滚动/分页(纵向/横向/双向)
setContentSize(w, h)          -- 设置内容区尺寸(影响滚动边界)

enableSubpageManager(opts)    -- 启用子页面管理(一次开启即可)
configureSubpages(factories)  -- 注册子页面工厂{name->function}
showSubpage(name[, factory])  -- 显示子页面;如未缓存则调用工厂创建
back()                        -- 关闭当前子页面,返回父窗口
closeSubpage(name, opts)      -- 关闭指定子页面;opts.destroy=true 彻底销毁

enableScroll(opts)

opts = {
    direction = "vertical" | "horizontal" | "both", -- 滚动方向,默认 "vertical"
    contentWidth  = <number>,  -- 内容宽度(默认等于窗口宽度)
    contentHeight = <number>,  -- 内容高度(默认等于窗口高度)
    threshold = <number>,      -- 判定拖拽门限像素,默认10
    pagingEnabled = <boolean>, -- 横向分页吸附开关(横向/双向时生效)
    pageWidth = <number>,      -- 分页宽度,默认窗口宽度
}

示例:纵向滚动列表

local win = ui.Window({ backgroundColor = ui.COLOR_WHITE })
win:enableScroll({ direction = "vertical", contentHeight = 1200, threshold = 8 })
-- 之后 add 的子组件会随滚动偏移显示

示例:横向分页(桌面式)

local win = ui.Window({ backgroundColor = ui.COLOR_WHITE })
win:enableScroll({ direction = "horizontal", pagingEnabled = true, pageWidth = 320, contentWidth = 320 * 3 })

8.2.1 Window.add

功能

向窗口添加一个子组件(任何实现了 draw/handleEvent 的组件)。

签名

Window:add(child)

参数

child
-- 参数含义:要添加的组件实例
-- 数据类型:table(组件对象)
-- 是否必选:是

返回值

示例

local btn = ui.Button({ x=20, y=40, w=120, h=44, text="OK" })
win:add(btn)

8.2.2 Window.remove

功能

从窗口中移除一个已添加的子组件。

签名

Window:remove(child)

参数

child
-- 参数含义:要移除的组件实例
-- 数据类型:table(组件对象)
-- 是否必选:是

返回值

boolean -- 是否成功移除

示例

win:remove(btn)

8.2.3 Window.clear

功能

清空窗口的所有子组件。

签名

Window:clear()

参数 / 返回值

示例

win:clear()

8.2.4 Window.setBackgroundImage

功能

设置窗口背景图。

签名

Window:setBackgroundImage(path)

参数

path
-- 参数含义:.jpg 图片路径
-- 数据类型:string
-- 是否必选:是

返回值

示例

win:setBackgroundImage("/luadb/wallpaper.jpg")

8.2.5 Window.setBackgroundColor

功能

设置窗口背景色,并清除已设置的背景图。

签名

Window:setBackgroundColor(color)

参数

color
-- 参数含义:RGB565 颜色值
-- 数据类型:number
-- 是否必选:是

返回值

示例

win:setBackgroundColor(ui.COLOR_WHITE)

8.2.6 Window.enableScroll

功能

启用窗口内容的拖拽滚动与可选的横向分页吸附。

签名

Window:enableScroll(opts)

参数

opts
-- 参数含义:滚动/分页配置
-- 数据类型:table(见上文 enableScroll(opts) 配置项)
-- 是否必选:否

返回值

Window -- 返回自身,便于链式调用

示例

win:enableScroll({ direction = "vertical", contentHeight = 1200 })

8.2.7 Window.setContentSize

功能

设置内容区尺寸(影响滚动边界的计算),通常在 enableScroll 后调用。

签名

Window:setContentSize(w, h)

参数

w, h
-- 参数含义:内容宽/高
-- 数据类型:number
-- 是否必选:至少提供其一

返回值

示例

win:setContentSize(320, 1200)

8.3 子页面(Subpage)使用

Window 内置子页面管理能力,便于在单窗口内组织多级页面与导航返回。

启用与注册

local home = ui.Window({ backgroundColor = 0xFFFF })
-- 一次启用(可省略,首次调用会自动启用)
home:enableSubpageManager({
    backEventName = "NAV.BACK",          -- 可选;默认 "NAV.BACK"
    onBack = function() log.info("nav", "back pressed") end, -- 可选
})

-- 注册子页面工厂(返回一个 Window 实例)
home:configureSubpages({
    settings = function() return require("settings_page").create(ui) end,
    about    = function() return require("about_page").create(ui) end,
})

8.3.1 Window.enableSubpageManager

功能

启用子页面管理能力,注册返回事件及可选回调;通常调用一次即可。

签名

Window:enableSubpageManager(opts)

参数

opts
-- 参数含义:可选项
-- 数据类型:table
-- 字段:
--   backEventName: string,返回事件名,默认 "NAV.BACK"
--   onBack: function(),收到返回事件时回调(在父窗口范围)

返回值

Window -- 返回自身

示例

home:enableSubpageManager({ backEventName = "NAV.BACK" })

8.3.2 Window.configureSubpages

功能

注册子页面工厂表;当使用 showSubpage 时按名称创建并缓存子页面。

签名

Window:configureSubpages(factories)

参数

factories
-- 参数含义:工厂表 { name -> function() return Window end }
-- 数据类型:table
-- 是否必选:是

返回值

Window -- 返回自身

示例

home:configureSubpages({ settings = function() return require("settings_page").create(ui) end })

8.3.3 Window.showSubpage

功能

显示指定名称的子页面;如未创建则调用工厂创建并缓存;显示子页面时会隐藏当前窗口。

签名

Window:showSubpage(name[, factory])

参数

name
-- 参数含义:子页面名称
-- 数据类型:string
-- 是否必选:是

factory
-- 参数含义:备用工厂(当未通过 configureSubpages 注册时提供)
-- 数据类型:function() -> Window
-- 是否必选:否

返回值

示例

home:showSubpage("settings")

8.3.4 Window.back

功能

在子页面中调用,使当前子页面隐藏,并在父窗口无其他子页面可见时恢复父窗口可见/可交互。

签名

Window:back()

参数 / 返回值

示例

self:back()

8.3.5 Window.closeSubpage

功能

关闭指定名称的子页面;当 opts.destroy=true 时从缓存中删除并触发垃圾回收。

签名

Window:closeSubpage(name, opts)

参数

name
-- 参数含义:子页面名称
-- 数据类型:string
-- 是否必选:是

opts
-- 参数含义:关闭选项
-- 数据类型:table
-- 字段:
--   destroy: boolean,是否销毁缓存

返回值

boolean -- 是否存在并处理该子页面

示例

home:closeSubpage("settings", { destroy = true })

8.3.6 返回事件(NAV.BACK)

功能

通过发布返回事件触发 onBack 回调;若没有任一子页面可见,则自动恢复父窗口可见。

签名

sys.publish("NAV.BACK")

示例

sys.publish("NAV.BACK")

完整示例

local home = ui.Window({ backgroundColor = 0xFFFF })
home:configureSubpages({
    checkbox = function() return require("checkbox_page").create(ui) end,
    msgbox   = function() return require("msgbox_page").create(ui) end,
})

local btn = ui.Button({ x = 20, y = 60, w = 280, h = 50, text = "进入子页", onClick = function()
    home:showSubpage("checkbox")
end })
home:add(btn)
ui.add(home)