Indice dei contenuti
Introduzione
Quando si realizzano delle GUI integrate, la coerenza dello stile e l’architettura pulita sono importanti.
LVGL offre un modo potente per controllare l’intero look & feel della tua applicazione utilizzando stili globali e un sistema di temi personalizzati.
Questo articolo spiega come fare:
- definire gli stili globali,
- collegarli a un tema personalizzato,
- aggiornare l’intera interfaccia con un’unica chiamata di funzione,
- e perché questo approccio migliora il flusso di lavoro dell’ingegneria, soprattutto nei progetti GUI di grandi dimensioni o in crescita.
Il tutto utilizzando il nostro display standard Riverdi da 10″.
Come funziona
LVGL ti permette di:
- Definire gli stili (lv_style_t),
- Crea un tema personalizzato,
- Assegna un callback che applica gli stili in base al tipo di oggetto,
- Dì a LVGL di ricostruire il tema e di aggiornare tutti gli oggetti.
Si tratta di un’architettura di tipo ingegneristico: un posto cambia tutto.
Esempio di codice - Tema globale riutilizzabile
Di seguito è riportato l’esempio completo di dimostrazione:
- stili globali per pulsanti e cursori,
- commutazione dinamica della tavolozza,
- restyling automatico di tutti gli oggetti.
Variabili di stile globali
static lv_style_t style_common_main;
static lv_style_t style_slider_main;
static lv_style_t style_slider_indicator;
static lv_style_t style_slider_knob;
static lv_palette_t current_palette = LV_PALETTE_ORANGE;
Richiamo dell’applicazione del tema
Applica automaticamente gli stili ai widget in base alla classe. Può essere facilmente esteso ad altri tipi di widget.
static void theme_apply_cb(lv_theme_t * th, lv_obj_t * obj)
{
if(lv_obj_check_type(obj, &lv_button_class)) {
lv_obj_add_style(obj, &style_common_main, 0);
}
if(lv_obj_check_type(obj, &lv_slider_class)) {
lv_obj_add_style(obj, &style_slider_main, LV_PART_MAIN);
lv_obj_add_style(obj, &style_slider_indicator, LV_PART_INDICATOR);
lv_obj_add_style(obj, &style_slider_knob, LV_PART_KNOB);
}
}
Ricostruisci il tema (trucco ingegneristico di base)
Questo ricostruisce gli stili, li collega a un tema e forza un aggiornamento globale.
static void rebuild_theme(void)
{
lv_style_reset(&style_common_main);
lv_style_reset(&style_slider_main);
lv_style_reset(&style_slider_indicator);
lv_style_reset(&style_slider_knob);
/* Stile del pulsante */
lv_style_init(&style_common_main);
lv_style_set_bg_color(&style_common_main, lv_palette_main(current_palette));
lv_style_set_border_color(&style_common_main, lv_palette_darken(LV_PALETTE_BLUE, 3)); lv_style_set_border_width(&style_common_main)style_common_main, lv_palette_darken(LV_PALETTE_BLUE, 3));
lv_style_set_border_width(&style_common_main, 3);
lv_style_set_radius(&style_common_main, 6);
/* Stili del cursore */
lv_style_init(&style_slider_main);
lv_style_set_bg_color(&style_slider_main, lv_palette_lighten(current_palette, 2));
lv_style_set_bg_opa(&style_slider_main, LV_OPA_COVER);
lv_style_init(&style_slider_indicator);
lv_style_set_bg_color(&style_slider_indicator, lv_palette_darken(current_palette, 2));
lv_style_init(&style_slider_knob);
lv_style_set_bg_color(&style_slider_knob, lv_color_white());
/* Allega il tema */
lv_theme_t * th_act = lv_display_get_theme(NULL);
static lv_theme_t th_new;
th_new = *th_act;
lv_theme_set_parent(&th_new, th_act);
lv_theme_set_apply_cb(&th_new, theme_apply_cb);
lv_display_set_theme(NULL, &th_new);
lv_obj_report_style_change(NULL);
}
Cambia il colore del tema
Qui abbiamo la funzione che cambia il colore del tema attualmente utilizzato quando si preme il pulsante. È solo per presentare la facilità di esecuzione. Per un maggior numero di colori, ti consiglio di utilizzare un array.
static void color_change_event_cb(lv_event_t * e)
{
if(current_palette == LV_PALETTE_ORANGE)
current_palette = LV_PALETTE_GREEN;
else if(current_palette == LV_PALETTE_GREEN)
current_palette = LV_PALETTE_BLUE;
else
current_palette = LV_PALETTE_ORANGE;
rebuild_theme();
}
Dimostrazione finale
Qui creiamo il pulsante predefinito in alto dal centro di visualizzazione. Poi chiamiamo la funzione rebuild_theme() per cambiare lo stile principale dei widget che utilizziamo. Ora possiamo creare un altro pulsante sotto il primo e anche un cursore sotto di esso. Dovresti essere in grado di vedere i diversi stili tra i pulsanti. Inoltre, dopo aver premuto il pulsante, cambiamo il colore dello stile dei nuovi widget, mentre quello predefinito rimane invariato.
void lv_example_style_change(void)
{
lv_obj_t * btn_default = lv_button_create(lv_screen_active());
lv_obj_align(btn_default, LV_ALIGN_CENTER, 0, -100);
lv_label_set_text(lv_label_create(btn_default), “Pulsante predefinito”);
rebuild_theme();
lv_obj_t * btn_themed = lv_button_create(lv_screen_active());
lv_obj_align(btn_themed, LV_ALIGN_CENTER, 0, 100);
lv_obj_add_event_cb(btn_themed, color_change_event_cb, LV_EVENT_CLICKED, NULL);
lv_label_set_text(lv_label_create(btn_themed), “Cambia colore del tema”);
lv_obj_t * slider = lv_slider_create(lv_screen_active());
lv_obj_align(slider, LV_ALIGN_CENTER, 0, 200);
lv_obj_set_width(slider, 250);
lv_slider_set_value(slider, 40, LV_ANIM_OFF);
}
Perché gli stili globali sono utili
La maggior parte degli ingegneri scopre rapidamente che lo stile della GUI diventa disordinato quando ogni pulsante, cursore o widget ha il proprio codice di stile.
I temi globali risolvono diversi problemi di ingegneria:
- Controllo visivo centralizzato
Tutta la logica dello stile è in un unico posto. Non dovrai visitare 10 file per modificare un pulsante o un cursore.
- Modifiche dell’interfaccia utente più rapide
Il cambio dei colori del marchio è immediato.
Il marketing chiede “verde invece di arancione”?
Cambia una variabile → l’intera GUI si aggiorna.
- Architettura scalabile per grandi progetti
Quando l’interfaccia utente cresce oltre le poche schermate, lo stile locale diventa ingestibile.
Garanzia dei temi globali:
- margini consistenti,
- raggi coerenti,
- utilizzo coerente della tavolozza,
- comportamento coerente del widget.
- Niente copia-incolla dello stile
Senza temi, gli ingegneri duplicano il codice di stile nelle varie schermate.
Gli stili globali eliminano le duplicazioni e riducono le dimensioni del codice.
- Il tema di runtime che cambia tipo:
- Modalità scuro/luminoso,
- Temi selezionabili dall’utente,
- Modalità di sicurezza (ad esempio, l’interfaccia utente “Attenzione” utilizza il tema rosso),
- Marchio OEM (un firmware, più skin visive).
Se vuoi saperne di più, visita il sito web di LVGL.
SCOPRI IL NOSTRO
Carta bianca
Ottieni un’interazione perfetta tra utente e display con il giusto IC per sensore tattile. Hai mai avuto problemi con eventi di tocco fantasma o con la certificazione? Potenzia la tua ricerca e sviluppo come un professionista con il nostro Whitepaper!



