Luat 功能开发教程(十六) LittleVGL
目录
- LittleVGL
- 简介
- 控件API说明
- 实现流程
- 示例
- image控件
- Canvas控件
- button控件
- Arc控件(加载器)
- page控件
- label控件
- Slider控件
- switch控件
- 常见问题
- 是否支持所有控件?
- 一款新屏,例如347D的屏能驱动吗?
- Air724有适配过比1.8寸更大的屏吗?
- LVGL 支持显示的图片格式有哪些?
- LVGL 支持透明图片显示吗?
- 相关资料以及购买链接
LittleVGL
简介
- LittlevGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用。
- 目前官方的LittleVGL只支持C语言和MicroPython两种开发语言,合宙在保留了官方接口的同时,推出了支持Lua语言的LittleVGL版本,方便开发者使用Lua语言在Air724U系列模块中开发图形界面。
控件API说明
API接口 | 描述 |
---|---|
lvgl.init() | lvgl初始化 |
lvgl.cont_create() | 创建容器 |
lvgl.img_create() | 创建image控件 |
lvgl.canvas_create() | 创建画布控件 |
lvgl.btn_create() | 创建按键控件 |
lvgl.arc_create() | 创建加载器控件 |
lvgl.page_create() | 创建page控件 |
lvgl.label_create() | 创建标签控件 |
lvgl.slider_create() | 创建滑动条控件 |
lvgl.sw_create() | 创建开关条控件 |
详细的使用介绍见Lua版本LittleVGL开发介绍
实现流程
lua版本的littlevgl继承了C语言版本的大部分接口,既能满足嵌入式UI界面开发,又能减少内存使用,详细的接口介绍可以参考《官方文档API部分》,中文翻译版本LVGL中文手册.pdf,只要将其中的lv_或者LV_开头去掉,换成lvgl.开头就可以直接使用,例如:
//button创建c接口
lv_obj_t *lv_btn_create(lv_obj_t *par, constlv_obj_t *copy)
//button创建Lua接口
lv_obj_t lvgl.btn_create(par, copy)
以其中按钮创建为例:
//C语言
void lv_ex_btn_1(void)
{lv_obj_t * label;lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);lv_obj_set_event_cb(btn1, event_handler);lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, -40);label = lv_label_create(btn1, NULL);lv_label_set_text(label, "Button");lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), NULL);lv_obj_set_event_cb(btn2, event_handler);lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 0, 40);lv_btn_set_toggle(btn2, true);lv_btn_toggle(btn2);lv_btn_set_fit2(btn2, LV_FIT_NONE, LV_FIT_TIGHT);label = lv_label_create(btn2, NULL);lv_label_set_text(label, "Toggled");
}
--Lua语言
function lv_ex_btn_1()act_src = lvgl.scr_act()btn1 = lv.btn_create(act_src, nil)lvgl.obj_set_event_cb(btn1, event_handler)lvgl.obj_align(btn1, nil, LVGL.ALIGN_CENTER, 0, -40)label = lvgl.label_create(btn1, nil)lvgl.label_set_text(label, "Button")btn2 = lvgl.btn_create(act_src, nil)lvgl.obj_set_event_cb(btn2, event_handler)lvgl.obj_align(btn2, nil, lvgl.ALIGN_CENTER, 0, 40)lvgl.btn_set_toggle(btn2, true)lvgl.btn_toggle(btn2)lvgl.btn_set_fit2(btn2, lvgl.FIT_NONE, lvgl.FIT_TIGHT)label = lvgl.label_create(btn2, nil)lvgl.label_set_text(label, "Toggled")
end
示例
image控件
image空间主要用来存放已经导入lua的图片资源文件,对应代码在demo\lvgl\widget.lua文件
local function empty()--创建容器(非必需)c = lvgl.cont_create(nil, nil)--创建image控件img = lvgl.img_create(c, nil)--设置image文件lvgl.img_set_src(img, "/lua/logo.png")--设置显示位置lvgl.obj_align(img, nil, lvgl.ALIGN_CENTER, 0, 0)--显示容器lvgl.disp_load_scr(c)
end
显示效果如下:
Canvas控件
Canvas(画布)控件类似于image控件,用户可以在这个控件上画任何内容、包括绘制图片、绘制线条、绘制文字等。lua中用该控件显示了二维码。
function create()--创建容器(非必需)scr = lvgl.cont_create(nil, nil)--创建画布控件cv = lvgl.canvas_create(scr, nil)lvgl.canvas_set_buffer(cv, 100, 100)lvgl.obj_align(cv, nil, lvgl.ALIGN_CENTER, 0, 0)layer_id = lvgl.canvas_to_disp_layer(cv)--设置当前画布的图层disp.setactlayer(layer_id)--根据数据生成二维码width, data = qrencode.encode('http://www.openluat.com')l_w, l_h = disp.getlayerinfo()displayWidth = 100--设置二维码显示位置disp.putqrcode(data, width, displayWidth, (l_w-displayWidth)/2, (l_h-displayWidth)/2)--显示画布图层disp.update()return scr
end
显示效果如下:
button控件
button控件比较好理解,可以相应用户在屏幕上的按下操作,并做出相应动作
function create()scr = lvgl.cont_create(nil, nil)style = lvgl.style_t()lvgl.style_copy(style, lvgl.style_plain)style.line.color = lvgl.color_hex(0x800000)style.line.width = 4btn = lvgl.btn_create(scr, nil)btn_label = lvgl.label_create(btn, nil)lvgl.label_set_text(btn_label, "按钮")lvgl.obj_align(btn, nil, lvgl.ALIGN_CENTER, 0, 40)lvgl.obj_set_size(btn, 60, 60)return scr
end
显示效果如下:
Arc控件(加载器)
加载器用一个圆圈的来表示一个任务的处理进程,处理完成后圆圈便完整显示出来
function create()scr = lvgl.cont_create(nil, nil)style = lvgl.style_t()lvgl.style_copy(style, lvgl.style_plain)style.line.color = lvgl.color_hex(0x800000)style.line.width = 4arc = lvgl.arc_create(scr, nil)lvgl.arc_set_style(arc, lvgl.ARC_STYLE_MAIN, style)lvgl.arc_set_angles(arc, 180, 180)lvgl.obj_set_size(arc, 40, 40)lvgl.obj_align(arc, nil, lvgl.ALIGN_CENTER, -30, -30)arc_label = lvgl.label_create(scr, nil)lvgl.label_set_text(arc_label, "加载器")lvgl.obj_align(arc_label, arc, lvgl.ALIGN_OUT_RIGHT_MID, 4, 0)sys.timerLoopStart(arc_loader, 100)return scr
end
显示效果如下:
page控件
page控件本身是一个容器,可以设置这个容器的大小,容器内部也可以放置其他的子控件。并且随着page的增大减小,page根据里面的内容来决定是否可以滑动显示
function create()black = lvgl.color_make(0, 0, 0)white = lvgl.color_make(0xff, 0xff, 0xff)scr = lvgl.cont_create(nil, nil)style_sb = lvgl.style_t()style_sb.body.main_color = blackstyle_sb.body.grad_color = blackstyle_sb.body.border.color = whitestyle_sb.body.border.width = 1style_sb.body.border.opa = lvgl.OPA_70style_sb.body.radius = lvgl.RADIUS_CIRCLEstyle_sb.body.opa = lvgl.OPA_60style_sb.body.padding.right = 3style_sb.body.padding.bottom = 3style_sb.body.padding.inner = 8page = lvgl.page_create(scr, nil)lvgl.obj_set_size(page, 100, 150)lvgl.obj_align(page, nil, lvgl.ALIGN_CENTER, 0, 0)lvgl.page_set_style(page, lvgl.PAGE_STYLE_SB, style_sb)return scr
end
显示效果如下:
label控件
标签控件一般用来显示一段文字,也可以显示多行文字
function create()...label = lvgl.label_create(page, nil)lvgl.label_set_long_mode(label, lvgl.LABEL_LONG_BREAK)lvgl.obj_set_width(label, lvgl.page_get_fit_width(page))lvgl.label_set_recolor(label, true)lvgl.label_set_text(label, [[Air722UGAir724UG行1行2行3]])-- lvgl.disp_load_scr(scr)return scr
end
显示效果如下:
Slider控件
滑动条类似进度条,但本身滑动条上有一个圈可以根据需要进行拖动。
function create()scr = lvgl.cont_create(nil, nil)style_bg = lvgl.style_t()style_indic = lvgl.style_t()style_knob = lvgl.style_t()lvgl.style_copy(style_bg, lvgl.style_pretty)style_bg.body.main_color = lvgl.color_hex(0x00ff00)style_bg.body.grad_color = lvgl.color_hex(0x000080)style_bg.body.radius = lvgl.RADIUS_CIRCLEstyle_bg.body.border.color = lvgl.color_hex(0xffffff)lvgl.style_copy(style_indic, lvgl.style_pretty_color)style_indic.body.radius = lvgl.RADIUS_CIRCLEstyle_indic.body.shadow.width = 8style_indic.body.shadow.color = style_indic.body.main_colorstyle_indic.body.padding.left = 3style_indic.body.padding.right = 3style_indic.body.padding.top = 3style_indic.body.padding.bottom = 3lvgl.style_copy(style_knob, lvgl.style_pretty)style_knob.body.radius = lvgl.RADIUS_CIRCLEstyle_knob.body.opa = lvgl.OPA_70style_knob.body.padding.top = 10style_knob.body.padding.bottom = 10--创建滑动条slider = lvgl.slider_create(scr, nil)lvgl.obj_set_size(slider, 100, 20)lvgl.slider_set_style(slider, lvgl.SLIDER_STYLE_BG, style_bg)lvgl.slider_set_style(slider, lvgl.SLIDER_STYLE_INDIC, style_indic)lvgl.slider_set_style(slider, lvgl.SLIDER_STYLE_KNOB, style_knob)lvgl.obj_align(slider, nil, lvgl.ALIGN_CENTER, 0, 0)-- lvgl.disp_load_scr(scr)label = lvgl.label_create(scr, nil)lvgl.label_set_text(label, "滑动条")lvgl.obj_align(label, slider, lvgl.ALIGN_OUT_BOTTOM_MID, 0, 0)return scr
end
显示效果如下:
switch控件
开关控件用来表示业务的状态开或者关。
function create()scr = lvgl.cont_create(nil, nil)...sw = lvgl.sw_create(scr, nil)lvgl.obj_align(sw, nil, lvgl.ALIGN_CENTER, 0, 0)lvgl.sw_set_style(sw, lvgl.SW_STYLE_BG, bg_style)lvgl.sw_set_style(sw, lvgl.SW_STYLE_INDIC, indic_style)lvgl.sw_set_style(sw, lvgl.SW_STYLE_KNOB_ON, knob_on_style)lvgl.sw_set_style(sw, lvgl.SW_STYLE_KNOB_OFF, knob_off_style)label = lvgl.label_create(scr, nil)lvgl.label_set_text(label, "开关")lvgl.obj_align(label, sw, lvgl.ALIGN_OUT_BOTTOM_MID, 0, 2)sys.timerStart(sw_toggle, 1000, true)return scrend
显示效果如下:
常见问题
是否支持所有控件?
目前Lua版本的LittleVGL由于空间有限,并未支持所有控件,已支持的常用控件:
button,image button, image, label, page, container, list, checkbox, slider, window, switch, Arc, spinbox, Animations,
一款新屏,例如347D的屏能驱动吗?
目前 Air724 所有支持的屏幕驱动已经添加到了 demo\ui 路径下,可以先在 demo 中查看自己需要的屏幕驱动是否已经实现。
如果屏幕驱动未实现,但是屏幕接口属于spi,或者i2c,那么用户需要自己根据屏幕厂家提供的 datasheet 进行驱动编写了。
若在未支持的屏幕中驱动调试碰到问题,也可以将屏幕寄给我们进行驱动调试。
Air724有适配过比1.8寸更大的屏吗?
这个是跟分辨率相关的,和屏幕尺寸无关,Air724 支持的屏幕分辨率最大是 240*320,如果这个分辨率的屏大于 1.8寸,同样也是可以驱动的。
LVGL 支持显示的图片格式有哪些?
目前LVGL支持显示的格式有 jpg, bmp, png。由于目前电脑端的图片查看处理软件相对智能,是依靠图片本身的文件数据结构判断文件格式并显示的,所以标注为 png 后缀的图片可能文件本身并不是 png 格式。所以如果图片在电脑端显示正常,但是无法通过 Air724 显示,需要确认图片本身格式是否与标注一致。
LVGL 支持透明图片显示吗?
LVGL支持透明图片显示。由于 jpg 和 bmp 格式本身是不支持透明背景的。所以如果显示图片的透明像素,请将格式转换为 png, 并通过 LVGL 官网转化为 bin 文件格式。
https://lvgl.io/tools/imageconverter
相关资料以及购买链接
Lua版本LittleVGL开发介绍
相关开发板购买链接
Air724UG开发板
Air724 开发板使用说明
Luat 功能开发教程(十六) LittleVGL相关推荐
- Luat 功能开发教程(十八) 阿里云
目录 阿里云 简介 API说明 实现流程 示例 阿里云操作 产品操作 设备操作 其他说明 LUAT方式连接概述 一机一密LUAT方式连接 一型一密LUAT方式连接 发布消息 订阅消息 OTA升级 常见 ...
- Luat 功能开发教程(十三) 生成二维码
目录 二维码 API说明 实现流程 示例 生成二维码 显示二维码 扫码 常见问题 为什么烧录了生成二维码的demo以后运行会报错 相关资料以及购买链接 二维码 二维条码/二维码(2-dimension ...
- Luat 功能开发教程(七) 基站 WIFI定位
目录 基站/WIFI定位 简介 API说明 实现流程 示例 常见问题 1. 如何在网站上查询小区对应的位置信息? 2. wifi定位失败的可能原因有哪些? 3. 基站定位获取的经纬度是什么格式的? 相 ...
- 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- 【Visual C++】游戏开发四十八 浅墨DirectX教程十六 三维地形系统的实现
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8685546 作者:毛星云(浅墨) ...
- EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换
目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler
原文地址为: Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler 上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程( ...
- ArcGIS Maritime Server 开发教程(六)Maritime Service 开发技巧
ArcGIS Maritime Server 开发教程(六)Maritime Service 开发技巧 本章导读:GIS 开发人员基于 Maritime Service 开发海图应用时总会遇到与海图数 ...
- S3C2416裸机开发系列十六_sd卡驱动实现
S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子 1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.数据传输快.可插拔.安全性好等优 ...
最新文章
- 区块链技术如何改变我们对DNA的看法
- GDCM:读取gdcm::DataSetHelper的测试程序
- MongoDB Driver:使用正确的姿势连接复制集
- pos加盟申请php_ThinkPHP万能表单程序源码 报名预约加盟申请调查表单程序源码
- SharePoint at .NET技术大会
- letsencrypt 自动续期不关闭nginx
- 未捕获的异常 'NSInternalInconsistencyException'
- 用t430搭建虚拟服务器教程,T430完美使用VmWare
- mysql 锁定表_MySQL表锁定
- cesium 文本标注被遮挡_Cesium-知识点(Viewer)
- python -- 判断给定的参数是否是地理位置的经度和纬度
- 刚入职就写了个bug,把几万用户搞蓝屏了···
- DOS命令行界面打开文件
- Flume1.6.0之Error-protobuf-This is supposed to be overridden by subclasses
- 网站seo运营中如何精确预测热门搜索关键词?
- 法语语法学习笔记——代词(2)
- c51单片机汇编语言1秒延时,51单片机汇编延时程序算法详解
- CentOS7安装squid代理服务器
- C\C ++语言 文件备份实验
- 年轻人宣言:青春符号