Introduction
Overview
LVGL is capable of loading UI elements written in XML. The XML file can be written by hand, but it's highly recommended to use LVGL's UI Editor to write the XML files. The UI Editor provides features like:
Instant preview the XML files
Autocomplete and Syntax highlight
Online preview for collaboration and testing
Figma integration to easily reimplement the designs
Warning
The UI Editor and the XML loader are still under development and not production ready. Consider them as an open beta, or experimental features.
Describing the UI in XML in a declarative manner offers several advantages:
XML files can be loaded at runtime (e.g., from an SD card) to change the application build.
XML is simpler to write than C, enabling people with different skill sets to create LVGL UIs.
XML is textual data, making it easy to parse and manipulate with scripts.
XML can be used to generate LVGL code in any language.
XML helps to separate the view from the logic.
Currently supported features:
Load XML components at runtime from file or data
Nest components and widgets any deep
Dynamically create instances of XML components in C
Register images and font that can be accessed by name later in the XMLs (only from file, no C file is generated for image and fonts)
Constants are working for widget and style properties
Parameters can be defined and passed and used for components
Most of the built-in widgets, even the complex ones (
label
,slider
,bar
,button
,chart
,scale
,button matrix
,table
, etc.)Style sheets and local styles that can be assigned to parts and states supporting almost all style properties
Limitations:
Screens are not supported yet (only components)
Events are not supported yet.
Animations are not supported yet.
Subjects are not supported yet.
The documentation is not complete yet.
Concept
The XML files are component-oriented. To be more specific, they are component library
oriented.
That is, they are structured in a way to make it easy to create reusable component libraries.
For example, a company can have a component library for the basic widgets for all its products (smart home, smart watch, smart oven, etc.), and create other industry-specific libraries (smart home-specific, smart watch-specific, etc.) containing only a few extra widgets.
These component libraries are independent, can be reused across many products, and can be freely versioned and managed.
You can imagine a component library as a collection of XML files, images, fonts, and other assets stored in a git repository, which can be a submodule in many projects.
If someone finds a bug in the component library, they can just fix it and push it back to the git repository so that other projects can pull it.
The built-in widgets of LVGL are also considered a component library
which is always available.
Widgets, Components, and Screens
It's important to distinguish between widgets
and components
:
Widgets are the core building blocks of the UI and are not meant to be loaded at runtime but rather compiled into the application. The main characteristics of widgets are:
In XML, they start with a
<widget>
root element.Similar to LVGL's built-in widgets.
Built from
lv_obj_class
-es.Have custom and complex logic inside.
Cannot be loaded from XML at runtime because the custom code cannot be loaded.
Have a large API with
set/get/add
functions.Support "internal widgets" (e.g.,
tabview
's tabs,dropdown
's list).
Any handwritten widget can be accessed from XML by:
Defining its API in an XML file.
Writing and registering an XML parser for it. See some examples here.
Components are built from other components and widgets and can be loaded at runtime. The main characteristics of components are:
In XML, they start with a
<component>
root element.Built in XML only and cannot have custom C code.
Can be loaded from XML at runtime as they describe only the visuals.
Built from widgets or other components.
Can be used for styling widgets.
Can contain widgets or other components.
Can have a simple API to pass properties to the children (e.g.,
btn_text
to label's text).
Regardless of whether the XML was written manually or by the UI Editor, the XMLs of the components can be registered in LVGL, and after that, instances can be created. In other words, LVGL can just read the XML files, "learn" the components from them, so that it can create components accordingly.
Screens are similar to components:
In XML, they start with a
<screen>
root element.Built from widgets or other components to describe the screen.
Can be loaded from XML at runtime as they describe only the visuals.
Do not have an API.
Can be referenced in screen load events.