LVGL使用弹性布局,将6个按键以两行三列分布在obj中
时间: 2023-07-15 13:15:06 浏览: 178
以下是使用LVGL的弹性布局实现将6个按键分布在obj中的示例代码:
```c
// 创建父对象
lv_obj_t *parent_obj = lv_obj_create(lv_scr_act(), NULL);
lv_obj_set_size(parent_obj, LV_HOR_RES, LV_VER_RES);
lv_obj_set_flex_flow(parent_obj, LV_FLEX_FLOW_ROW_WRAP); // 设置弹性布局流为换行
// 创建6个按键对象
lv_obj_t *button1 = lv_btn_create(parent_obj, NULL);
lv_obj_t *button2 = lv_btn_create(parent_obj, NULL);
lv_obj_t *button3 = lv_btn_create(parent_obj, NULL);
lv_obj_t *button4 = lv_btn_create(parent_obj, NULL);
lv_obj_t *button5 = lv_btn_create(parent_obj, NULL);
lv_obj_t *button6 = lv_btn_create(parent_obj, NULL);
// 设置按键大小和样式
lv_obj_set_size(button1, LV_HOR_RES / 3 - 10, 50);
lv_obj_set_size(button2, LV_HOR_RES / 3 - 10, 50);
lv_obj_set_size(button3, LV_HOR_RES / 3 - 10, 50);
lv_obj_set_size(button4, LV_HOR_RES / 3 - 10, 50);
lv_obj_set_size(button5, LV_HOR_RES / 3 - 10, 50);
lv_obj_set_size(button6, LV_HOR_RES / 3 - 10, 50);
lv_btn_set_style(button1, LV_BTN_STYLE_REL, &lv_style_btn_rel);
lv_btn_set_style(button2, LV_BTN_STYLE_REL, &lv_style_btn_rel);
lv_btn_set_style(button3, LV_BTN_STYLE_REL, &lv_style_btn_rel);
lv_btn_set_style(button4, LV_BTN_STYLE_REL, &lv_style_btn_rel);
lv_btn_set_style(button5, LV_BTN_STYLE_REL, &lv_style_btn_rel);
lv_btn_set_style(button6, LV_BTN_STYLE_REL, &lv_style_btn_rel);
// 将按键对象添加到父对象中
lv_obj_add_child(parent_obj, button1);
lv_obj_add_child(parent_obj, button2);
lv_obj_add_child(parent_obj, button3);
lv_obj_add_child(parent_obj, button4);
lv_obj_add_child(parent_obj, button5);
lv_obj_add_child(parent_obj, button6);
// 设置按键在父对象中的位置
lv_obj_set_flex_align(button1, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
lv_obj_set_flex_align(button2, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
lv_obj_set_flex_align(button3, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
lv_obj_set_flex_align(button4, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
lv_obj_set_flex_align(button5, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
lv_obj_set_flex_align(button6, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START);
// 设置按键间距
lv_obj_set_flex_grow(button1, 1);
lv_obj_set_flex_grow(button2, 1);
lv_obj_set_flex_grow(button3, 1);
lv_obj_set_flex_grow(button4, 1);
lv_obj_set_flex_grow(button5, 1);
lv_obj_set_flex_grow(button6, 1);
lv_obj_set_flex_basis(button1, LV_HOR_RES / 3 - 10);
lv_obj_set_flex_basis(button2, LV_HOR_RES / 3 - 10);
lv_obj_set_flex_basis(button3, LV_HOR_RES / 3 - 10);
lv_obj_set_flex_basis(button4, LV_HOR_RES / 3 - 10);
lv_obj_set_flex_basis(button5, LV_HOR_RES / 3 - 10);
lv_obj_set_flex_basis(button6, LV_HOR_RES / 3 - 10);
// 等待事件
while (1) {
lv_task_handler();
lv_tick_inc(5);
vTaskDelay(5 / portTICK_PERIOD_MS);
}
```
在上面的代码中,首先创建了一个父对象`parent_obj`,设置其大小为整个屏幕大小,并将其弹性布局流设置为换行。然后创建了6个按键对象`button1`到`button6`,并设置它们的大小和样式。接着将这些按键对象添加到父对象中,并设置它们在父对象中的位置和间距。最后,进入事件循环等待事件。
在上面的代码中,我们使用了以下几个函数来设置弹性布局:
- `lv_obj_set_flex_flow(obj, flow)`:设置弹性布局的流方向,可以是`LV_FLEX_FLOW_ROW`(行)或`LV_FLEX_FLOW_COLUMN`(列),还可以加上`LV_FLEX_FLOW_WRAP`(折行)或`LV_FLEX_FLOW_REVERSE`(反向)等属性。
- `lv_obj_set_flex_align(obj, main_axis, cross_axis, base_axis)`:设置弹性布局的对齐方式,其中`main_axis`表示主轴方向的对齐方式,`cross_axis`表示交叉轴方向的对齐方式,`base_axis`表示基线方向的对齐方式。对齐方式可以是`LV_FLEX_ALIGN_START`(起始对齐)、`LV_FLEX_ALIGN_CENTER`(居中对齐)或`LV_FLEX_ALIGN_END`(末尾对齐)等。
- `lv_obj_set_flex_grow(obj, grow)`:设置弹性布局中的增长因子,决定了一个对象在剩余空间中所占的比例。增长因子越大,所占比例越多。
- `lv_obj_set_flex_basis(obj, basis)`:设置弹性布局中的基础尺寸,用于计算对象在剩余空间中所占的大小。基础尺寸越大,所占大小越多。
阅读全文