ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
23 февраля
1500690 Топик полностью
Бoмж (Вчера, 22:55, просмотров: 36) ответил AlexG на TouchGFX vs LVGL. В TouchGFX есть такая штука, "custom container" - контейнер с виджетами, который можно использовать повторно много раз на разных экранах. Например, так можно сделать статусбар, присутствующий на всех экранах. Что будет эквивалентом в LVGL?
Grok 3 

В 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).
Для постоянных элементов, таких как статусбар, лучше использовать главный экран с постоянным контейнером для статусбара и отдельным контейнером для переключаемого содержимого.

memento mori