connect.minco.com
EXPERT INSIGHTS & DISCOVERY

changing a buttons properties when clicked in lvgl

connect

C

CONNECT NETWORK

PUBLISHED: Mar 27, 2026

Changing a Button’s Properties When Clicked in LVGL: A Practical Guide

changing a buttons properties when clicked in lvgl is a fundamental task that many developers encounter when designing interactive graphical interfaces. Whether you’re building a smart home dashboard, a wearable device interface, or any embedded touchscreen application, tweaking a button’s appearance or behavior upon user interaction can greatly enhance the user experience. LVGL (Light and Versatile Graphics Library) provides an efficient and flexible way to achieve this, allowing developers to create visually appealing and responsive UI elements.

In this article, we’ll dive into how you can change a button’s properties dynamically when it’s clicked in LVGL. We’ll explore event handling, style manipulation, and practical examples to help you master this aspect of LVGL development.

Understanding LVGL Button Basics

Before we jump into changing a button’s properties when clicked in LVGL, it’s important to grasp the basics of how buttons work within this GUI library. LVGL is designed to be lightweight and modular, perfect for embedded systems with limited resources.

In LVGL, buttons are objects (lv_obj_t) that respond to user touch or mouse events. Each button has default styles, states (like released, pressed, checked), and can be customized extensively through styles and event callbacks.

Core Button Properties You Can Modify

When a button is clicked, you might want to change its properties such as:

  • Color (background, border, text color)
  • Size (width, height)
  • Text label (changing the text displayed on the button)
  • State (toggled on/off, enabled/disabled)
  • Visibility (show/hide the button)
  • Animation effects (fade, scale)

These attributes help convey feedback and improve UI intuitiveness.

How to Detect Button Clicks in LVGL

To change a button’s properties on click, you first need to detect the click event. LVGL uses a powerful event handling system where you can assign event callbacks to objects.

Here’s how you typically detect a button click:

void btn_event_cb(lv_event_t * e) {
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * btn = lv_event_get_target(e);

    if(code == LV_EVENT_CLICKED) {
        // Button was clicked
    }
}

You attach this callback to your button:

lv_obj_t * btn = lv_btn_create(lv_scr_act());
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);

This setup ensures that whenever the button receives an event, your callback is triggered, and you can react accordingly.

Changing a Button’s Properties When Clicked in LVGL

Once you catch the LV_EVENT_CLICKED event, you can modify the button’s properties. There are two primary ways to change a button’s appearance in LVGL:

  1. Modify the button’s style dynamically
  2. Change the button’s attributes or child objects like labels

Modifying Button Styles on Click

LVGL uses a style system that allows you to define how objects look in different states (default, pressed, focused, etc.). You can alter these styles on the fly.

For example, to change the background color of a button upon click:

void btn_event_cb(lv_event_t * e) {
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * btn = lv_event_get_target(e);

    if(code == LV_EVENT_CLICKED) {
        static lv_style_t clicked_style;
        lv_style_init(&clicked_style);
        lv_style_set_bg_color(&clicked_style, lv_palette_main(LV_PALETTE_RED));
        lv_obj_add_style(btn, &clicked_style, 0);
    }
}

This code initializes a style with a red background and applies it to the button once clicked.

Changing Button Text Dynamically

Often, changing the text label on a button provides clear feedback. Here’s how you can do it:

void btn_event_cb(lv_event_t * e) {
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * btn = lv_event_get_target(e);

    if(code == LV_EVENT_CLICKED) {
        lv_obj_t * label = lv_obj_get_child(btn, 0);  // Assuming the first child is the label
        lv_label_set_text(label, "Clicked!");
    }
}

This approach modifies the button’s label immediately after the click event.

Tips for Effective Button Property Changes in LVGL

Use Styles for Consistency

Instead of changing individual properties directly, define and reuse styles. This approach keeps your code clean and your UI consistent.

Manage Object States Carefully

LVGL buttons have states such as LV_STATE_CHECKED or LV_STATE_DISABLED. Manipulating these states can automatically trigger built-in style changes.

For example, toggling a button’s checked state on click:

if(code == LV_EVENT_CLICKED) {
    lv_obj_toggle_state(btn, LV_STATE_CHECKED);
}

You can then define styles for the checked state that automatically apply.

Consider Animation for Smooth Transitions

To create a polished interface, you can animate property changes:

lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, btn);
lv_anim_set_values(&a, 100, 200); // example values for width
lv_anim_set_time(&a, 300);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_width);
lv_anim_start(&a);

Animating color, size, or opacity changes on button clicks can provide delightful user feedback.

Practical Example: Toggle Button Color and Text on Click

Let’s put it all together with a real-world example where a button toggles its background color and text each time it’s clicked.

void btn_event_cb(lv_event_t * e) {
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * btn = lv_event_get_target(e);
    lv_obj_t * label = lv_obj_get_child(btn, 0);

    static bool toggled = false;

    if(code == LV_EVENT_CLICKED) {
        toggled = !toggled;

        if(toggled) {
            lv_obj_set_style_bg_color(btn, lv_palette_main(LV_PALETTE_GREEN), 0);
            lv_label_set_text(label, "ON");
        } else {
            lv_obj_set_style_bg_color(btn, lv_palette_main(LV_PALETTE_GREY), 0);
            lv_label_set_text(label, "OFF");
        }
    }
}

void create_toggle_btn(void) {
    lv_obj_t * btn = lv_btn_create(lv_scr_act());
    lv_obj_set_size(btn, 120, 50);
    lv_obj_center(btn);

    lv_obj_t * label = lv_label_create(btn);
    lv_label_set_text(label, "OFF");
    lv_obj_center(label);

    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
}

This snippet creates a button that switches between green and grey backgrounds and toggles its label between "ON" and "OFF" each time it's clicked — a simple yet effective interaction.

Common Pitfalls and How to Avoid Them

When working on changing a buttons properties when clicked in lvgl, a few common mistakes can trip up developers:

  • Forgetting to initialize styles before use: Always initialize lv_style_t structures with lv_style_init() before applying them.
  • Not attaching event callbacks properly: Ensure your callback is attached to the button with the correct event type.
  • Assuming label is always the first child: If your button has multiple children, make sure you correctly identify the label object.
  • Overusing inline style changes: Excessive inline changes can clutter your code; prefer predefined styles for maintainability.

Expanding Beyond Buttons: Event-Driven Property Changes

While this article focuses on buttons, the principles of changing properties upon events apply to many LVGL objects — sliders, switches, dropdowns, and more. Understanding how to manipulate styles and respond to events unlocks a wide range of dynamic UI possibilities in your embedded projects.

Exploring LVGL’s event system and style architecture in depth can help you build interfaces that feel responsive and polished, making your applications stand out.


Changing a button’s properties when clicked in LVGL is a powerful technique that elevates user interaction. By leveraging event callbacks, styles, and object manipulation, you can create engaging buttons that provide clear, immediate feedback to users. As you get comfortable with these concepts, you’ll find endless opportunities to enhance your embedded GUIs with LVGL’s flexible toolkit.

In-Depth Insights

Changing a Button’s Properties When Clicked in LVGL: A Deep Dive into Interactive UI Design

changing a buttons properties when clicked in lvgl is a fundamental aspect of developing dynamic and responsive graphical user interfaces (GUIs) using the LittlevGL (LVGL) library. LVGL, known for its lightweight and efficient graphics library tailored for embedded devices, provides robust mechanisms to manipulate widget properties, enabling developers to create engaging user experiences. This article explores the practicalities and technical nuances of modifying button properties on click events within LVGL, offering insights into event handling, property customization, and best practices for interactive UI components.

Understanding Button Interactivity in LVGL

At its core, LVGL facilitates the creation of scalable UI elements with intuitive event-driven programming. Buttons, as one of the essential widgets, often require state changes or visual feedback when users interact with them. Changing a button’s properties when clicked in LVGL entails responding to user input events—most commonly the LV_EVENT_CLICKED event—and dynamically adjusting the button’s attributes such as size, color, label text, style, or state.

Unlike static UI elements, interactive buttons must provide visual cues that confirm user actions, improving usability and accessibility. LVGL's architecture supports this through event callbacks, allowing developers to hook into the button lifecycle and implement property changes seamlessly.

Event Handling Mechanisms for Button Clicks

The LVGL event system is integral to managing user interactions. When a button is clicked, LVGL emits an event that triggers any registered callback functions. These callbacks receive an event data structure, enabling the modification of the button or related UI components.

To change a button’s properties upon a click, developers typically:

  1. Create the button object using lv_btn_create().
  2. Register an event callback with lv_obj_add_event_cb(), specifying the LV_EVENT_CLICKED event.
  3. Within the callback, modify properties such as styles, labels, or states using LVGL APIs.

This approach ensures that the UI remains responsive and that changes occur only in response to user interactions, preserving system resources and maintaining a fluid user experience.

Modifying Button Properties: Techniques and Best Practices

LVGL offers a comprehensive API for altering button properties dynamically. Some common modifications when a button is clicked include:

  • Changing the Button's Style: Adjusting background color, border width, or radius to signify a pressed or toggled state.
  • Updating the Label Text: Providing immediate textual feedback such as “Clicked” or toggling between “On” and “Off”.
  • Altering Size or Position: Implementing visual animations by resizing or moving the button subtly.
  • Changing the Button State: Utilizing LVGL’s built-in state management to toggle between LV_STATE_CHECKED and LV_STATE_DEFAULT.

For example, a straightforward method for changing a button’s background color on click involves creating a custom style and applying it within the callback. This not only enhances visual feedback but also aligns with LVGL’s design philosophy of separating styles from widget logic.

However, developers should carefully consider the performance implications of frequent style changes, especially on resource-constrained devices. Caching styles or limiting updates to essential properties can mitigate potential latency.

Advanced Use Cases: Toggle Buttons and State Management

A prevalent scenario in embedded UI design is implementing toggle buttons, where the button’s appearance and behavior alternate with each click. LVGL simplifies this with state flags and event-driven callbacks.

Implementing a Toggle Button

To create a toggle button that changes its properties when clicked, the workflow involves:

  • Setting the button to support checkable states using lv_obj_add_state(btn, LV_STATE_CHECKABLE).
  • Handling the LV_EVENT_VALUE_CHANGED event to detect toggling.
  • Within the event callback, updating styles or labels based on whether lv_obj_has_state(btn, LV_STATE_CHECKED) returns true or false.

This pattern not only changes the button’s visual properties but also allows integrating logical state changes, such as enabling or disabling features in the embedded system.

Comparing LVGL’s Approach with Other GUI Frameworks

When juxtaposing LVGL with other UI frameworks like Qt or GTK, the process of changing button properties upon clicks reveals distinct differences rooted in target platforms and design goals.

LVGL emphasizes minimal memory footprint and hardware efficiency, which dictates a more manual yet flexible approach to event handling and styling. In contrast, frameworks like Qt provide higher-level abstractions and declarative UI definitions, making property changes more straightforward but potentially heavier on system resources.

For embedded developers prioritizing performance and customization, LVGL’s method of programmatically changing properties via event callbacks is both powerful and necessary.

Practical Example: Changing Button Color and Label on Click

To illustrate, consider a code snippet demonstrating how to change a button’s background color and label text when clicked:

static void btn_event_cb(lv_event_t * e) {
    lv_obj_t * btn = lv_event_get_target(e);
    lv_obj_t * label = lv_obj_get_child(btn, 0);
    
    if(lv_event_get_code(e) == LV_EVENT_CLICKED) {
        static bool toggled = false;
        toggled = !toggled;
        
        if(toggled) {
            lv_obj_set_style_bg_color(btn, lv_palette_main(LV_PALETTE_RED), 0);
            lv_label_set_text(label, "Clicked");
        } else {
            lv_obj_set_style_bg_color(btn, lv_palette_main(LV_PALETTE_BLUE), 0);
            lv_label_set_text(label, "Click Me");
        }
    }
}

void create_button(lv_obj_t * parent) {
    lv_obj_t * btn = lv_btn_create(parent);
    lv_obj_set_size(btn, 120, 50);
    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
    
    lv_obj_t * label = lv_label_create(btn);
    lv_label_set_text(label, "Click Me");
    lv_obj_center(label);
}

This example highlights how LVGL’s flexible styling and event system enable developers to deliver immediate visual feedback, enhancing usability.

Considerations for Responsive UI Design

While changing button properties on click enhances interactivity, developers should balance responsiveness with hardware constraints. Using LVGL’s built-in animations, such as lv_anim_t, can smooth transitions without taxing the system excessively.

Moreover, consistent visual language across buttons—using standardized colors and styles for states like pressed, disabled, or toggled—improves user comprehension and interface coherence.

Integrating Accessibility and User Feedback

Beyond aesthetics, changing a button’s properties when clicked in LVGL plays a crucial role in accessibility. For users with varying abilities, providing clear visual or tactile feedback upon interaction is vital.

LVGL supports multi-modal feedback including screen readers and haptic signals, which can be triggered alongside property changes. Incorporating such features ensures that embedded devices using LVGL remain inclusive and user-friendly.

Through thoughtful manipulation of button properties, developers can craft interfaces that not only look appealing but also communicate effectively with users.

The process of changing a button’s properties when clicked in LVGL exemplifies the blend of low-level control and high-level design flexibility that defines modern embedded GUI development. By mastering event-driven property manipulation, developers unlock the potential to create highly responsive and intuitive user interfaces tailored to diverse applications.

💡 Frequently Asked Questions

How can I change the color of a button when it is clicked in LVGL?

You can change the button's color when clicked by setting an event callback for the button and modifying its style in the LV_EVENT_CLICKED or LV_EVENT_PRESSED event. For example, in the event callback, use lv_obj_set_style_bg_color() to set a different background color.

What LVGL event should I use to detect a button click to change its properties?

Use the LV_EVENT_CLICKED event in your button's event callback function to detect when the button is clicked and then change its properties accordingly.

Can I change the button size dynamically when it is clicked in LVGL?

Yes, inside the button's event callback function responding to the click event, you can call lv_obj_set_size() to dynamically change the button's width and height.

How do I change the button's label text when it is clicked in LVGL?

Attach an event callback to the button, and in the LV_EVENT_CLICKED event, get the button's label child using lv_obj_get_child() and then call lv_label_set_text() to update the label text.

Is it possible to toggle a button's properties (like color or text) back and forth on each click in LVGL?

Yes, you can maintain a state variable (e.g., a boolean) in your event callback or app logic, and on each LV_EVENT_CLICKED, toggle the state and update the button's properties accordingly to achieve a toggle effect.

How do I change the button's border style when clicked in LVGL?

In the button's event callback for LV_EVENT_CLICKED, use lv_obj_set_style_border_width() and lv_obj_set_style_border_color() to change the border width and color dynamically.

Discover More

Explore Related Topics

#lvgl button event
#lvgl button click
#lvgl button style change
#lvgl button state
#lvgl button pressed
#lvgl event handler
#lvgl widget properties
#lvgl style update
#lvgl button animation
#lvgl GUI interaction