lv_obj_add_flag()
函数原型
c
void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t flag);
头文件 :lvgl.h
obj:目标对象指针flag:要设置的对象标志位,可以多个标志位按位或|同时传入
所属:LVGL 对象系统,用来给控件添加状态/行为标记,不修改样式,修改对象行为属性。
相关配套函数
c
// 添加标志
void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t flag);
// 清除标志
void lv_obj_clear_flag(lv_obj_t * obj, lv_obj_flag_t flag);
// 判断是否拥有该标志
bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t flag);
// 切换标志(有就清除,没有就添加)
void lv_obj_toggle_flag(lv_obj_t * obj, lv_obj_flag_t flag);
常用 lv_obj_flag_t 标志(LVGL 9.x)
| 标志 | 作用 |
|---|---|
LV_OBJ_FLAG_HIDDEN |
对象隐藏,不再渲染,也不接收输入 |
LV_OBJ_FLAG_CLICKABLE |
对象可点击接收输入事件 |
LV_OBJ_FLAG_CLICK_FOCUSABLE |
点击时获取焦点 |
LV_OBJ_FLAG_SCROLLABLE |
允许对象滚动(容器常用) |
LV_OBJ_FLAG_SCROLL_ELASTIC |
滚动到边界有弹性回弹效果 |
LV_OBJ_FLAG_SCROLL_MOMENTUM |
滑动松手后惯性滚动 |
LV_OBJ_FLAG_SCROLL_CHAIN |
把滚动传递给父对象 |
LV_OBJ_FLAG_FLOATING |
对象不受父对象裁剪限制,可以绘制到父外面 |
LV_OBJ_FLAG_OVERFLOW_VISIBLE |
子对象超出父边界也绘制出来 |
LV_OBJ_FLAG_EVENT_BUBBLE |
事件向上冒泡到父对象 |
⚠️区分:
lv_obj_flag_t:对象行为标志 ,lv_obj_add_flag()lv_state_t:对象状态 (按下、聚焦、禁用),lv_obj_add_state()
使用示例
1. 隐藏对象
c
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); //隐藏
lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); //显示
2. 开启容器滚动,弹性+惯性
c
lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLLABLE |
LV_OBJ_FLAG_SCROLL_MOMENTUM |
LV_OBJ_FLAG_SCROLL_ELASTIC);
3. 判断标志
c
if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN))
{
//对象处于隐藏
}
关键注意点
- 多标志用按位或
|,不是逗号分隔。 LV_OBJ_FLAG_HIDDEN:隐藏后对象完全不参与渲染和输入,不等于设置样式透明度lv_style_set_opa()HIDDEN:完全消失,不占用渲染opa=0:看不见,但还占位置,还能接收点击事件
LV_OBJ_FLAG_FLOATING / OVERFLOW_VISIBLE:父对象默认会裁剪子控件,想要子控件画到父控件外面,需要开启这两个标志。- flag是对象实例属性,不会继承给子对象,每个对象独立。
容易踩坑
- 容器滚动不生效:忘记设置
LV_OBJ_FLAG_SCROLLABLE;或者父对象裁剪,子大小没有超过容器大小。 - 设置透明度看不见控件,但还能点击:只是样式opa为0,没有设置
LV_OBJ_FLAG_HIDDEN。