UI设计详解

本文主要讲解通过手写代码设计UI界面过程,会对标题,状态栏,连接控制,数据发送和数据接收这几个界面分别讲解。 # 界面划分界 界面设计主要有标题,状态栏,连接控制,数据发送和数据接收几个部分组成。 ![image.png](https://cos.easydoc.net/22753220/files/l2y4c9bd.png) # 界面设计 ## lvgl 初始化 lvgl 初始化是在main.lua脚本中实现的,代码如下: ```lua lvgl.init(function() end, tp.input) ``` ## 加载样式文件,启动状态栏与初始容器 ```lua require "stytle" makeHead(_G.body) -- 启动状态栏 makeBox(_G.body) -- 主体内容初始容器 ``` ## 加载各个界面 ```lua require "fragment_home" --控制设置,数据收发容器初始化 require "fragment_systemSet" --连接控制设置页面 require "fragment_systemSocket" --数据发送接收页面 require "fragment_fontSet" --字体设置页面 fragment_home.init(_G.BOX) --控制设置,数据收发容器初始化 ``` ## 状态栏界面 状态栏界面是在mian.lua脚本中实现的,有4部分组成:标题标签,时间标签,设置按钮,4G 图标 ### 标题标签 ```lua --标题标签 local sysname=lvgl.label_create(headCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(sysname, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font36) end lvgl.label_set_recolor(sysname, true) lvgl.label_set_text(sysname,"#FFFFFF Socket测试系统") lvgl.obj_align(sysname, headCont, lvgl.ALIGN_IN_LEFT_MID, 35, 0) ``` ### 时间标签 ```lua --时间标签 local dateLabel=lvgl.label_create(statusLabelCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(dateLabel, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_recolor(dateLabel, true) lvgl.label_set_text(dateLabel,"") lvgl.obj_align(dateLabel,statusLabelCont, lvgl.ALIGN_IN_LEFT_MID,20, 0) sys.subscribe("SYSTEM_CHANGE_TIME",function(date) lvgl.label_set_text(dateLabel,"#FFFFFF "..date) end) ``` ### 设置按钮 ```lua --设置按钮 local settingBtn=lvgl.cont_create(statusLabelCont, nil) lvgl.obj_set_size(settingBtn, 60,32) lvgl.obj_add_style(settingBtn, lvgl.CONT_PART_MAIN, style.style_msgBg) lvgl.cont_set_layout(settingBtn,lvgl.LAYOUT_CENTER) if _G.Font=="vector"then lvgl.obj_align(settingBtn,statusLabelCont, lvgl.ALIGN_IN_LEFT_MID,282, 0) else lvgl.obj_align(settingBtn,statusLabelCont, lvgl.ALIGN_IN_LEFT_MID,232, 0) end local settingLabel=lvgl.label_create(settingBtn, nil) lvgl.label_set_recolor(settingLabel, true) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(settingLabel, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_text(settingLabel, "#217bda 设置") local function settingHandler(obj, event) if event == lvgl.EVENT_CLICKED then _G.BEEP() -- print("设置按钮按下") if not _G.fragmentFontSetting then fragment_fontSet.init(_G.BOX) lvgl.label_set_text(settingLabel, "#217bda 返回") _G.fragmentFontSetting = true else --fragment_fontSet.init(unInit) fragment_home.init(_G.BOX) lvgl.label_set_text(settingLabel, "#217bda 设置") _G.fragmentFontSetting = false end end end lvgl.obj_set_event_cb(settingBtn,settingHandler) ``` ### 4G图标 ```lua --4G 图标 local signImg=lvgl.img_create(statusLabelCont, nil) lvgl.img_set_src(signImg,"/lua/nosin_icon.png") lvgl.obj_align(signImg,statusLabelCont, lvgl.ALIGN_IN_RIGHT_MID, -20, 0) sys.subscribe("RSSI_CHANGE",function(img) lvgl.img_set_src(signImg,img) end) ``` ## 连接控制设置界面 连接控制设置界面是在fragment_systemSet.lua中实现,有连接控制标签,协议下来框,地址输入文本,端口输入文本,连接按钮5部分组成。 ### 连接控制标签 ```lua function makeLable(text,x,y) local label=lvgl.label_create(sysCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_text(label, text) lvgl.obj_align(label, sysCont, lvgl.ALIGN_IN_LEFT_MID, x, y) end makeLable("连接控制",0,0) ``` ### 协议下来框 ```lua event_handler = function(obj, event) if (event == lvgl.EVENT_VALUE_CHANGED) then local opt = lvgl.dropdown_get_selected(obj) log.info("Option:", lvgl.dropdown_get_selected(obj)) _G.BEEP() if opt == 1 then _G.ipProtocol = "udp" else _G.ipProtocol = "tcp" end end end function makeDropdown() local itemCont=lvgl.cont_create(setCont, nil) lvgl.obj_set_click(itemCont,false) lvgl.obj_set_size(itemCont, 210,40) lvgl.obj_add_style(itemCont, lvgl.CONT_PART_MAIN, style.style_divBox) local label=lvgl.label_create(itemCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_text(label, "协议:") lvgl.obj_align(label, itemCont, lvgl.ALIGN_IN_LEFT_MID, 0, 0) local dd = lvgl.dropdown_create(itemCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(dd, lvgl.DROPDOWN_PART_SELECTED,lvgl.STATE_DEFAULT, font24) lvgl.obj_set_style_local_text_font(dd, lvgl.DROPDOWN_PART_LIST,lvgl.STATE_DEFAULT, font24) lvgl.obj_set_style_local_text_font(dd, lvgl.DROPDOWN_PART_MAIN,lvgl.STATE_DEFAULT, font24) end lvgl.dropdown_set_options(dd, [[TCP UDP]]) lvgl.obj_set_event_cb(dd, event_handler) lvgl.obj_set_size(dd, 150,40) lvgl.obj_align(dd, itemCont, lvgl.ALIGN_IN_LEFT_MID, 60, 0) end ``` ### 地址输入文本 ```lua --地址输入框 local itemCont=lvgl.cont_create(setCont, nil) lvgl.obj_set_click(itemCont,false) lvgl.obj_set_size(itemCont, 210,80) lvgl.obj_add_style(itemCont, lvgl.CONT_PART_MAIN, style.style_divBox) lvgl.obj_align(itemCont, setCont, lvgl.ALIGN_CENTER, 0, 0) local label=lvgl.label_create(itemCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_text(label, "地址:") lvgl.obj_align(label, itemCont, lvgl.ALIGN_IN_LEFT_MID, 0, 0) makeLimitBox(itemCont,"addr",_G.ipAddress) ``` ### 端口输入文本 ```lua --端口输入框 local itemCont=lvgl.cont_create(setCont, nil) lvgl.obj_set_click(itemCont,false) lvgl.obj_set_size(itemCont, 210,80) lvgl.obj_add_style(itemCont, lvgl.CONT_PART_MAIN, style.style_divBox) lvgl.obj_align(itemCont, setCont, lvgl.ALIGN_IN_BOTTOM_MID, 0, 0) local label=lvgl.label_create(itemCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_text(label, "端口:") lvgl.obj_align(label, itemCont, lvgl.ALIGN_IN_LEFT_MID, 0, 0) makeLimitBox(itemCont,"prot",_G.ipPort) ``` ### 连接按钮 ```lua event_handler_btn = function(obj, event) if event == lvgl.EVENT_CLICKED then _G.BEEP() log.info("UI makeQRbtn",_G.fragmentConnect) if _G.fragmentConnect then lvgl.label_set_text(_G.connLabel, "#FFFFFF 断开连接") _G.fragmentConnect = false sys.publish("CONNECT_IND") else lvgl.label_set_text(_G.connLabel, "#FFFFFF 连接") _G.fragmentConnect=true sys.publish("SOCKET_DISCONNECT_IND") socketOutMsg.sndTest("disconnect") end end end function makeConnBtn() local btn = lvgl.cont_create(sysCont, nil) lvgl.obj_set_size(btn, 200, 50) lvgl.obj_add_style(btn, lvgl.BTN_PART_MAIN, style.style_QRbtnBg) lvgl.obj_set_event_cb(btn, event_handler_btn) _G.connLabel=lvgl.label_create(btn, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(_G.connLabel, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_recolor(_G.connLabel, true) lvgl.label_set_text(_G.connLabel, "#FFFFFE 连接") lvgl.obj_align(_G.connLabel, btn, lvgl.ALIGN_CENTER, 0, 0) end ``` ## 数据发送界面 数据发送界面是在fragment_systemSocket.lua脚本中实现的,有发送数据标签,发送数据输入框,发送按钮3部分组成。 ### 送数据标签 ```lua function makeLable(text,x,y) local label=lvgl.label_create(sysCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_text(label, text) lvgl.obj_align(label, sysCont, lvgl.ALIGN_IN_TOP_MID, x, y) end makeLable("发送数据",0,0) ``` ### 发送数据输入框 ```lua --创建limit输入框 local function makeLimitBox(cont,alignObj,alignX,alignY,p1,p2) local limitCont=lvgl.cont_create(cont, nil) lvgl.obj_set_click(limitCont,false) lvgl.obj_set_size(limitCont, 202,280) lvgl.obj_add_style(limitCont, lvgl.CONT_PART_MAIN, style.style_divBox) lvgl.obj_align(limitCont,cont, lvgl.ALIGN_IN_TOP_MID, 5, 2) --输入框回调 local function paraChange(obj) sendData = lvgl.textarea_get_text(obj) log.info("UI sendData",sendData) end local inputLeft=inputBox.init(limitCont,200,278,lvgl.ALIGN_CENTER,5, 0,p1,paraChange) return limitCont,inputLeft,inputRight end --发送内容输入框 local itemCont=lvgl.cont_create(sysCont, nil) lvgl.obj_set_click(itemCont,false) lvgl.obj_set_size(itemCont, 210,260) lvgl.obj_add_style(itemCont, lvgl.CONT_PART_MAIN, style.style_divBox) makeLimitBox(itemCont,sysCont,10,0,"socket send test","09") ``` ### 发送按钮 ```lua event_handler_send = function(obj, event) if event == lvgl.EVENT_CLICKED then _G.BEEP() socketOutMsg.sndTest(sendData) log.info("UI makeSendBtn",_G.fragmentSend) if _G.fragmentSend then _G.fragmentSend = false else _G.fragmentSend=true end end end function makeSendBtn() local btn = lvgl.cont_create(sysCont, nil) lvgl.obj_set_size(btn, 200, 50) lvgl.obj_add_style(btn, lvgl.BTN_PART_MAIN, style.style_QRbtnBg) lvgl.obj_set_event_cb(btn, event_handler_send) local Label=lvgl.label_create(btn, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(Label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_recolor(Label, true) lvgl.label_set_text(Label, "#FFFFFE 发送") lvgl.obj_align(Label, btn, lvgl.ALIGN_CENTER, 0, 0) end ``` ## 数据接收界面 数据发送界面是在fragment_systemSocket.lua脚本中实现的,有数据接收标签,数据接收内容标签,数据接收字节统计标签3部分组成。 ### 数据接收标签 ```lua --数据接收 local label=lvgl.label_create(recvCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_text(label, "数据接收") lvgl.obj_align(label, recvCont, lvgl.ALIGN_IN_TOP_MID, 0, 0) ``` ### 数据接收内容标签 ```lua local itemCont=lvgl.cont_create(recvCont, nil) lvgl.obj_set_click(itemCont,false) lvgl.obj_set_size(itemCont, 210,260) lvgl.obj_add_style(itemCont, lvgl.CONT_PART_MAIN, style.style_msgBg) RecvLabel=lvgl.label_create(itemCont, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(RecvLabel, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_long_mode(RecvLabel,lvgl.LABEL_LONG_BREAK) lvgl.obj_set_width(RecvLabel, 200) lvgl.label_set_text(RecvLabel, _G.recvData) lvgl.obj_align(RecvLabel, itemCont, lvgl.ALIGN_IN_TOP_LEFT, 0, 0) ``` ### 数据接收字节统计标签 ```lua local btn = lvgl.cont_create(recvCont, nil) lvgl.obj_set_size(btn, 200, 50) lvgl.obj_add_style(btn, lvgl.BTN_PART_MAIN, style.style_QRbtnBg) --lvgl.obj_set_event_cb(btn, event_handler_send) RecvLenLabel=lvgl.label_create(btn, nil) if _G.Font=="vector"then lvgl.obj_set_style_local_text_font(RecvLenLabel, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font24) end lvgl.label_set_recolor(RecvLenLabel, true) lvgl.label_set_text(RecvLenLabel, "#FFFFFE 已接收"..#_G.recvData.."个字节") lvgl.obj_align(RecvLenLabel, btn, lvgl.ALIGN_CENTER, 0, 0) ``` # 其它参考资料 [UI开发指南](https://easydoc.net/doc/50207163/vRKgmDaY/lMLY2Rha)