docs/README_zh.md
<a href="https://github.com/sponsors/lvgl" target="_blank"></a>
<p align="right"> <a href="../README.md">English</a> | <b>中文</b> | <a href="./README_pt_BR.md">Português do Brasil</a> | <a href="./README_jp.md">日本語</a> | <a href="./README_he.md">עברית</a> </p> <p align="center"> </p> <h1 align="center"> Light and Versatile Graphics Library </h1> <h1 align="center"> 轻量级通用型图形库 </h1> <div align="center"></div> <p align="center"> <a href="https://lvgl.io" title="LVGL 官方网站">网站</a> | <a href="https://pro.lvgl.io" title="LVGL Pro 基于 XML 的 UI 编辑器">LVGL Pro 编辑器</a> | <a href="https://docs.lvgl.io/" title="包含 100+ 示例的详细文档">文档</a> | <a href="https://forum.lvgl.io" title="寻求帮助或帮助他人">论坛</a> | <a href="https://lvgl.io/demos" title="在浏览器中运行的演示">演示</a> | <a href="https://lvgl.io/services" title="图形设计、UI 实现和咨询服务">服务</a> </p>
LVGL 是一个免费、开源的 UI 库,可用于为来自任何厂商、任何平台的 MCU 或 MPU 创建图形用户界面。
要求:LVGL 无需外部依赖,因此可以轻松编译到任何现代平台上,从小型 MCU 到支持 3D 的多核 Linux MPU。简单 UI 仅需约 100kB RAM、200–300kB Flash,以及 1/10 屏幕大小的渲染缓冲区。
开始使用:选择一个可直接使用的 VSCode、Eclipse 或其他项目,在 PC 上尝试 LVGL。LVGL 的 UI 代码完全平台无关,因此也可直接用于嵌入式设备。
LVGL Pro 是一套完整的工具包,可让你更快地构建、测试、共享和发布 UI。它附带一个 XML 编辑器,你可以在其中快速创建和测试可重用组件,导出 C 代码,或在运行时加载 XML。了解更多信息请点击这里。
免费与可移植性
控件、样式、布局等
LVGL 无外部依赖,因此可轻松编译到任何设备,并已被多个包管理器与 RTOS 集成:
LVGL Pro 是一套完整的工具,用于高效构建、测试、共享和交付嵌入式 UI。
它包含四个紧密集成的工具:
这些工具结合在一起,帮助开发者高效构建 UI、可靠测试,并便于团队协作。
了解更多:https://pro.lvgl.io
LVGL LLC 提供多种商业服务,助力 UI 开发。凭借超过 15 年的用户界面与图形经验,我们能将你的产品 UI 提升到更高水平。
联系我们,告诉我们如何帮助你。
集成 LVGL 非常简单。将其添加到项目中并像其他源文件一样编译即可。
配置时复制 lv_conf_template.h 为 lv_conf.h,启用第一个 #if 0 并按需修改配置。
(默认配置通常已足够。)LVGL 也支持通过 Kconfig 配置。
项目中可按以下方式初始化 LVGL 并创建显示和输入设备:
#include "lvgl/lvgl.h" /*定义 LV_LVGL_H_INCLUDE_SIMPLE 可直接使用 "lvgl.h"*/
#define TFT_HOR_RES 320
#define TFT_VER_RES 240
static uint32_t my_tick_cb(void)
{
return my_get_millisec();
}
static void my_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map)
{
/*将 px_map 写入帧缓冲或显示控制器对应区域*/
}
static void my_touch_read_cb(lv_indev_t * indev, lv_indev_data_t * data)
{
if(my_touch_is_pressed()) {
data->point.x = touchpad_x;
data->point.y = touchpad_y;
data->state = LV_INDEV_STATE_PRESSED;
} else {
data->state = LV_INDEV_STATE_RELEASED;
}
}
void main(void)
{
my_hardware_init();
/*初始化 LVGL*/
lv_init();
/*设置毫秒级时钟回调,用于 LVGL 计时*/
lv_tick_set_cb(my_tick_cb);
/*创建显示对象,用于添加屏幕和控件*/
lv_display_t * display = lv_display_create(TFT_HOR_RES, TFT_VER_RES);
/*添加渲染缓冲,这里假设使用 16 位 RGB565 格式*/
static uint8_t buf[TFT_HOR_RES * TFT_VER_RES / 10 * 2];
lv_display_set_buffers(display, buf, NULL, sizeof(buf), LV_DISPLAY_RENDER_MODE_PARTIAL);
/*设置刷新回调,将缓冲内容写入显示设备*/
lv_display_set_flush_cb(display, my_flush_cb);
/*创建输入设备用于触摸处理*/
lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
lv_indev_set_read_cb(indev, my_touch_read_cb);
/*驱动已就绪,创建 UI*/
lv_obj_t * label = lv_label_create(lv_screen_active());
lv_label_set_text(label, "Hello world");
lv_obj_center(label);
/*循环执行 LVGL 任务*/
while(1) {
lv_timer_handler();
my_sleep_ms(5);
}
}
可在 https://docs.lvgl.io/master/examples.html 查看 100+ 示例。
在线预览器 https://viewer.lvgl.io/ 也提供了易学的 XML 教程。
static void button_clicked_cb(lv_event_t * e)
{
printf("Clicked\n");
}
[...]
lv_obj_t * button = lv_button_create(lv_screen_active());
lv_obj_center(button);
lv_obj_add_event_cb(button, button_clicked_cb, LV_EVENT_CLICKED, NULL);
lv_obj_t * label = lv_label_create(button);
lv_label_set_text(label, "Hello from LVGL!");
<screen>
<view>
<lv_button align="center">
<event_cb callback="button_clicked_cb" />
<lv_label text="Hello from LVGL!" />
</lv_button>
</view>
</screen>
static void my_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
{
printf("Slider value: %d\n", lv_subject_get_int(subject));
}
[...]
static lv_subject_t subject_value;
lv_subject_init_int(&subject_value, 35);
lv_subject_add_observer(&subject_value, my_observer_cb, NULL);
lv_style_t style_base;
lv_style_init(&style_base);
lv_style_set_bg_color(&style_base, lv_color_hex(0xff8800));
lv_style_set_bg_opa(&style_base, 255);
lv_style_set_radius(&style_base, 4);
lv_obj_t * slider = lv_slider_create(lv_screen_active());
lv_obj_center(slider);
lv_obj_set_size(slider, lv_pct(80), 16);
lv_obj_add_style(slider, &style_base, LV_PART_INDICATOR);
lv_obj_add_style(slider, &style_base, LV_PART_KNOB);
lv_obj_add_style(slider, &style_base, 0);
lv_obj_set_style_bg_opa(slider, LV_OPA_50, 0);
lv_obj_set_style_border_width(slider, 3, LV_PART_KNOB);
lv_obj_set_style_border_color(slider, lv_color_hex3(0xfff), LV_PART_KNOB);
lv_slider_bind_value(slider, &subject_value);
lv_obj_t * label = lv_label_create(lv_screen_active());
lv_obj_align(label, LV_ALIGN_CENTER, 0, -30);
lv_label_bind_text(label, &subject_value, "Temperature: %d °C");
<screen>
<styles>
<style name="style_base" bg_opa="100%" bg_color="0xff8800" radius="4" />
<style name="style_border" border_color="0xfff" border_width="3" />
</styles>
<view>
<lv_label bind_text="value" bind_text-fmt="Temperature: %d °C" align="center" y="-30" />
<lv_slider align="center" bind_value="value" style_bg_opa="30%">
<style name="style_base" />
<style name="style_base" selector="knob" />
<style name="style_base" selector="indicator" />
<style name="style_border" selector="knob" />
</lv_slider>
</view>
</screen>
/*创建新屏幕并加载*/
lv_obj_t * scr = lv_obj_create(NULL);
lv_screen_load(scr);
/*设置列布局*/
lv_obj_set_flex_flow(scr, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(scr, LV_FLEX_ALIGN_SPACE_EVENLY, /*垂直对齐*/
LV_FLEX_ALIGN_START, /*主轴方向对齐*/
LV_FLEX_ALIGN_CENTER); /*交叉轴方向对齐*/
/*创建 5 个复选框*/
const char * texts[5] = {"Input 1", "Input 2", "Input 3", "Output 1", "Output 2"};
for(int i = 0; i < 5; i++) {
lv_obj_t * cb = lv_checkbox_create(scr);
lv_checkbox_set_text(cb, texts[i]);
}
/*更改状态*/
lv_obj_add_state(lv_obj_get_child(scr, 1), LV_STATE_CHECKED);
lv_obj_add_state(lv_obj_get_child(scr, 3), LV_STATE_DISABLED);
<screen>
<view
flex_flow="column"
style_flex_main_place="space_evenly"
style_flex_cross_place="start"
style_flex_track_place="center"
>
<lv_checkbox text="Input 1"/>
<lv_checkbox text="Input 2"/>
<lv_checkbox text="Input 3" checked="true"/>
<lv_checkbox text="Output 1"/>
<lv_checkbox text="Output 2" disabled="true"/>
</view>
</screen>
LVGL 是一个开放项目,欢迎任何形式的贡献。无论是分享你的项目、编写示例、改进文档、修复错误,还是将项目托管到 LVGL 组织下,都非常欢迎。
更多贡献方式详见 贡献文档。
已有超过 600 位开发者为 LVGL 留下足迹。加入我们吧!🙂
<a href="https://github.com/lvgl/lvgl/graphs/contributors"> </a>
……还有更多人。