В TouchGFX "custom container" — это специальный объект, который позволяет объединить несколько виджетов в один компонент, определяя его внешний вид и поведение. Такой контейнер можно многократно использовать на различных экранах, например, для создания статусбара, который присутствует на всех экранах приложения.
Эквивалент в LVGL
В LVGL эквивалентом "custom container" является контейнер (lv_cont). Это базовый объект, который может содержать другие виджеты (кнопки, метки, изображения и т.д.) и позволяет группировать их для создания повторно используемых компонентов. Однако в LVGL подход к реализации таких компонентов немного отличается, особенно для элементов, которые должны быть постоянными, как статусбар.
Реализация повторно используемых компонентов в LVGL
Есть два основных подхода к созданию и использованию контейнеров в LVGL, в зависимости от ваших потребностей:
1. Создание контейнера для каждого экрана
Вы можете определить функцию, которая создает контейнер с нужными виджетами и настройками. Например:
c
lv_obj_t* create_status_bar() { lv_obj_t* status_bar = lv_cont_create(NULL, NULL); // Добавляем виджеты в контейнер (например, метки для времени, батареи и т.д.) lv_obj_t* time_label = lv_label_create(status_bar, NULL); lv_label_set_text(time_label, "12:00"); // Настраиваем расположение и стили return status_bar; }
Затем эту функцию можно вызывать для каждого экрана, чтобы создать отдельный экземпляр статусбара:
c
lv_obj_t* screen1 = lv_obj_create(NULL, NULL); lv_obj_t* status_bar1 = create_status_bar(); lv_obj_add_child(screen1, status_bar1);
Преимущества:
Каждый экран независим и самодостаточен.
Недостатки:
Если статусбар отражает глобальное состояние (например, время или уровень заряда батареи), вам придется обновлять каждый экземпляр отдельно, что может привести к несогласованности или дополнительным затратам ресурсов.
2. Использование главного экрана с постоянным контейнером
Этот подход более эффективен для постоянных элементов интерфейса, таких как статусбар. Вы создаете один главный экран, который содержит:
Контейнер для статусбара (например, вверху экрана).
Контейнер для основного содержимого, где происходит переключение "экранов".
Пример реализации:
c
// Создаем главный экран lv_obj_t* main_screen = lv_obj_create(NULL, NULL); // Создаем статусбар lv_obj_t* status_bar = create_status_bar(); lv_obj_align(status_bar, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); // Создаем контейнер для содержимого lv_obj_t* content_container = lv_cont_create(main_screen, NULL); lv_cont_set_layout(content_container, LV_LAYOUT_COLUMN_MID); lv_obj_align(content_container, NULL, LV_ALIGN_CENTER, 0, 0);
Для переключения содержимого вы очищаете content_container и добавляете новое содержимое:
c
void switch_to_screen1() { lv_obj_clean(content_container); lv_obj_t* screen1_content = create_screen1_content(); lv_obj_add_child(content_container, screen1_content); }
Преимущества:
Только один экземпляр статусбара, что упрощает обновление глобального состояния (например, времени или батареи).
Более эффективно с точки зрения ресурсов.
Недостатки:
Требуется управлять переключением содержимого внутри главного экрана, что может быть чуть сложнее настроить.
Рекомендация для статусбара
Для статусбара, который должен присутствовать на всех экранах и отображать глобальное состояние, рекомендуется использовать второй подход (главный экран с постоянным контейнером). Это соответствует принципам работы многих GUI-фреймворков для реализации постоянных элементов интерфейса и обеспечивает:
Единый экземпляр статусбара, который легко обновлять.
Экономию ресурсов по сравнению с созданием копий для каждого экрана.
Общий вывод
Эквивалент "custom container" в LVGL — это контейнер (lv_cont), который можно использовать для группировки виджетов и создания повторно используемых компонентов.
Для повторно используемых компонентов вы можете:
Создавать экземпляры контейнера для каждого экрана с помощью функции.
Или копировать шаблонный контейнер с помощью lv_obj_create(parent, copy).
Для постоянных элементов, таких как статусбар, лучше использовать главный экран с постоянным контейнером для статусбара и отдельным контейнером для переключаемого содержимого.