The examples shown in the widget documentation live here. The fastest way to add one is to copy an existing example next to the one you're adding and adjust it — the surrounding files already follow every convention.
- XML (preferred) —
lv_example_<module>_<feature>.xmlin its own<module>/<feature>/folder. Use for anything declarative: layout, styling, properties, data binding. The C examples are generated from it, see below. - C-only —
lv_example_<module>_<feature>.cdirectly in the<module>/folder. Use only when the point is imperative C that XML can't express (event callbacks, animations, draw events), or a feature XML doesn't support yet.
Most widgets need many XML examples and zero or one C-only example.
- XML:
widgets/arc/lv_example_arc_set_angles.xml - XML with data binding:
widgets/slider/lv_example_slider_bind_value.xml - C-only:
widgets/arc/lv_example_arc_event.c
You write .xml; a script produces the shipped .c. Never hand-edit a
generated .c — your changes will be overwritten.
python scripts/generate_examples.py [path ...] # all examples if no pathRun it after every new or edited XML, then build to confirm it compiles.
The script auto-runs scripts/code-format.py examples at the end so every
generated .c ships astyle-formatted, and then wipes all .c/.h files
from examples/xml_project/ (the CLI's project scaffolding) so they can't
collide with the host project's source globbing.
The generator drives the LVGL Pro editor CLI (lved-cli.js), which
ships with the LVGL Pro editor — see https://lvgl.io/docs/pro. The script
picks it up from your PATH, or point at it explicitly:
python scripts/generate_examples.py --cli /path/to/lved-cli.js [path ...]- Fit 320×240 — every example runs in that target (see
xml_project/project.xml). Size widgets to fit. - Reuse shared resources — subjects, consts, styles and images come from
xml_project/globals.xml. Don't invent per-example subjects; add toglobals.xmlonly if nothing fits. - One example = one feature. Show a meaningful variation, not defaults.
- Each example is surfaced in the docs with
<LvglExample>.
Every XML example opens with a comment block directly above <screen>,
plus one in-view hint. Keep the layers distinct — never repeat a sentence:
@title— short, capitalized; mirrors the on-screen label. No "XML".@brief— one sentence, less than 80 chars, ending with a period.- Description — 2–3 sentences after
@brief: name the specific attributes/values that vary and why it's interesting. Self-contained (readable without the doc page). - 💡 hint — first child of
<view>: imperative and specific about what to do and what visibly changes ("Drag each arc; lowerchange_ratelags behind"), not a vague "Adjust the arc".
The XML format and the editor are documented at https://lvgl.io/docs/pro. For the in-tree conventions, the best reference is the existing examples — match the file you copied.