【LVGL】笔记一,lv_obj基础对象

本文介绍了使用LVGL创建基础控件的过程,包括定义对象、设置位置等基本操作,并提供了示例代码。此外还介绍了几个重要的API,如对象删除、对齐及设置大小等。

参考资料

学习参考资料:正点原子 littleVGL 开发指南
资料链接:http://www.openedv.com/thread-13912-1-1.html

对象

使用各种控件(标签,按钮)之前需要先定义一个对象,用如下方式定义。

lv_obj_t* screen;//创建一个名为screen的基础对象。

lv_obj_t是一个宏定义的结构体,里面存放了对象的一些属性,如果在创建实例对象之后不去修改参数,将会有系统自带的默认参数。
通常我习惯用screen这个对象作为当前的屏幕对象,并以此为最基础的父级。

screen = lv_scr_act();

lv_scr_act这个函数官方的解释是获取当前活跃的屏幕,并返回指向这个屏幕的指针。这在里我们刚好使用screen来接收。
然后我们在用同样的方法创建另一个对象

lv_obj_t* obj1 = lv_obj_create(screen,NULL);
lv_obj_set_pos(obj1,50,50);

这里我们将父级设为刚刚的屏幕对象screen。并设置obj1的坐标为50,50.
这里用到了两个函数:
lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
在我本人使用的这个版本,好像是7.11.需要有两个参数传入
parent:最为父级的对象,如果不传,填NULL将会创建一个屏幕对象
copy:指向copy对象的指针,如果不为NULL,则将从中复制新对象
返回值是指向你新创建对象的指针。
lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
这个参数一看就知道是什么意思。需要注意的是。这个坐标是相对于父级的坐标.
完整代码如下:

   lv_obj_t* screen = lv_scr_act();
   lv_obj_t* obj1 = lv_obj_create(screen,NULL);
   lv_obj_set_pos(obj1,50,50);

仿真现象如下:
(注:屏幕设置大小为240*240像素)
由一下两个宏定义决定。在LVGL8之后好像不需要定义了
LV_HOR_RES_MAX,
LV_VER_RES_MAX,
在LVGL8好像是这么定义的。在这里插入图片描述
然后比较重要的API有:
lv_obj_del();立即删除对象。删除之后屏幕上就会消失。除此之外还有一个异步删除,异步删除是在下一个lv_task_handler ()调用的时候才删除。
lv_obj_align();对其函数。具体用法看函数参数一眼就能明白很简单。
lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h);设置对象的大小。
目前就这些,后面会慢慢补充

<think>我们正在讨论LVGL对象标志的组合使用。用户提到了四个标志:CLICKABLE、PRESS_LOCK、CLICK_FOCUSABLE和SCROLLABLE。我们需要理解这些标志的含义以及如何组合使用它们。 根据引用[1]和引用[2],我们知道LVGL对象可以通过`lv_obj_add_flag`和`lv_obj_clear_flag`来设置或清除标志位。这些标志位控制对象的行为和属性。 首先,我们分别解释每个标志: 1. **CLICKABLE**:使对象可以接收点击事件。如果对象没有设置CLICKABLE,那么它不会对点击事件作出反应。设置后,对象可以响应`LV_EVENT_CLICKED`等事件。 2. **PRESS_LOCK**:这个标志通常与CLICKABLE起使用。当用户按下对象然后滑动出对象区域时,如果设置了PRESS_LOCK,那么对象会保持按下状态(即锁定按下状态),直到用户释放。如果没有设置,当用户滑动出对象区域时,对象会立即恢复到未按下状态。 3. **CLICK_FOCUSABLE**:这个标志控制点击对象时是否自动聚焦。如果设置,点击对象会使其成为焦点对象(获得输入焦点);如果不设置,点击不会改变焦点。 4. **SCROLLABLE**:允许对象内部的内容可以滚动。注意,这并不意味着对象本身可以滚动,而是对象作为容器时,其内容可以滚动。例如,个文本区域可以滚动显示长文本。 接下来,我们讨论如何组合这些标志: - **组合CLICKABLE和PRESS_LOCK**:这种组合常用于需要长按或者拖动操作的对象。例如,个按钮如果设置了PRESS_LOCK,即使用户在按下后稍微滑出按钮区域,按钮仍然保持按下状态,直到用户释放。这在防止误操作时很有用。 - **组合CLICKABLE和CLICK_FOCUSABLE**:如果希望点击对象后该对象获得焦点(例如输入框),那么需要同时设置这两个标志。如果只设置CLICKABLE而不设置CLICK_FOCUSABLE,那么点击对象不会改变焦点,但对象仍然可以响应点击事件。 - **组合CLICKABLE和SCROLLABLE**:个常见的例子是滚动列表中的可点击项。列表(容器)需要设置SCROLLABLE以便滚动,而列表中的项需要设置CLICKABLE以便点击。注意,如果同对象同时设置了这两个标志,那么当在该对象上滚动时,可能会触发点击事件。因此,通常不会在同对象上同时使用这两个标志,而是将可点击的对象放在可滚动的容器内。 - **同时组合多个标志**:例如,个可点击、可滚动、点击可聚焦并且支持按下锁定的对象。但这样的组合可能并不常见,因为对象通常不会同时需要这么多行为。需要根据实际需求来组合。 使用示例: ```c // 创建对象 lv_obj_t * obj = lv_obj_create(lv_scr_act()); // 添加多个标志 lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); // 可点击 lv_obj_add_flag(obj, LV_OBJ_FLAG_PRESS_LOCK); // 按下锁定 lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); // 点击可聚焦 lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLLABLE); // 可滚动 // 如果需要移除某个标志,例如移除SCROLLABLE lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE); ``` 注意事项: - 标志的组合可能会产生相互影响。例如,设置了PRESS_LOCK后,在滚动操作中可能会干扰滚动事件,因为按下锁定会保持对象的按下状态,从而可能阻止滚动开始。因此,需要根据实际场景测试和调整。 - 引用[2]中提到,LVGL不会立即重新计算坐标变化,而是标记为“脏”,在重绘前更新。因此,如果修改了对象的标志(特别是影响布局的标志),可能需要调用`lv_obj_update_layout()`来强制更新布局。 最后,关于用户的问题,我们给出了标志的解释和组合方法。用户可能是在开发LVGL应用时需要为某个对象设置合适的行为,因此我们提供了使用示例和注意事项。 相关问题: 1. LVGL中如何同时移除多个对象标志? 2. 在LVGL中,对象标志设置后如何立即生效? 3. 除了用户提到的标志,LVGL还有哪些常用对象标志?</think>### LVGL对象标志组合详解 在LVGL中,对象标志(flags)通过位掩码方式组合使用,可同时启用多个特性。您提到的`CLICKABLE`、`PRESS_LOCK`、`CLICK_FOCUSABLE`和`SCROLLABLE`标志组合常用于创建交互式控件,以下是详细解析和使用方法: #### 1. **标志含义** - **`LV_OBJ_FLAG_CLICKABLE`** 使对象可接收点击事件(如`LV_EVENT_CLICKED`),是交互控件的基础[^3]。 - **`LV_OBJ_FLAG_PRESS_LOCK`** 锁定按压状态:当用户按下对象后移出区域,对象仍保持按压状态(`LV_STATE_PRESSED`)[^2]。 - **`LV_OBJ_FLAG_CLICK_FOCUSABLE`** 点击时自动获取焦点:用户点击后对象自动进入`LV_STATE_FOCUSED`状态[^1]。 - **`LV_OBJ_FLAG_SCROLLABLE`** 启用内容滚动:当内容超出对象边界时允许滚动(需配合布局使用)[^2]。 #### 2. **组合使用场景** ```c // 创建对象设置标志组合 lv_obj_t *btn = lv_btn_create(parent); lv_obj_add_flags(btn, LV_OBJ_FLAG_CLICKABLE | // 启用点击 LV_OBJ_FLAG_PRESS_LOCK | // 锁定按压状态 LV_OBJ_FLAG_CLICK_FOCUSABLE |// 点击获取焦点 LV_OBJ_FLAG_SCROLLABLE // 允许滚动 ); ``` #### 3. **行为特点** - **事件触发顺序**: `PRESSED` → `CLICKED` → `FOCUSED`(当`CLICK_FOCUSABLE`启用时) - **滚动与点击协调**: 轻触触发点击,拖拽触发滚动(需设置`lv_obj_set_scroll_dir`指定方向) - **焦点管理**: 通过`lv_group_add_obj()`可将对象加入焦点组,实现键盘导航[^1] #### 4. **注意事项** 1. **布局更新延迟**: 修改标志后需调用`lv_obj_update_layout()`强制刷新布局[^2]: ```c lv_obj_update_layout(btn); // 确保坐标/尺寸立即生效 ``` 2. **标志冲突处理**: - `SCROLLABLE`与`CLICKABLE`在拖拽操作时可能冲突,可通过事件过滤解决: ```c lv_obj_add_event_cb(btn, event_cb, LV_EVENT_ALL, NULL); ``` 在回调中根据`lv_event_get_code(e)`区分点击和滚动事件。 3. **内存优化**: 动态删除对象时使用`lv_obj_delete_async()`避免实时性要求高的场景卡顿[^3]。 #### 5. **典型应用案例** ```c // 创建可滚动点击列表项 lv_obj_t *list = lv_list_create(lv_scr_act()); lv_obj_add_flags(list, LV_OBJ_FLAG_SCROLLABLE); lv_obj_t *item = lv_list_add_btn(list, NULL, "Item"); lv_obj_add_flags(item, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_PRESS_LOCK | LV_OBJ_FLAG_CLICK_FOCUSABLE ); // 事件回调示例 static void event_cb(lv_event_t *e) { if(lv_event_get_code(e) == LV_EVENT_CLICKED) { printf("Clicked: %s\n", lv_list_get_btn_text(item)); } else if(lv_event_get_code(e) == LV_EVENT_SCROLL) { // 处理滚动逻辑 } } lv_obj_add_event_cb(item, event_cb, LV_EVENT_ALL, NULL); ``` ### 相关问题 1. 如何检测LVGL对象标志是否被设置? 2. `PRESS_LOCK`标志在触摸屏和编码器输入中有何不同行为? 3. 当同时启用`SCROLLABLE`和`CLICKABLE`时,如何避免误触发点击事件? 4. LVGL对象焦点管理的实现原理是什么? [^1]: LVGL学习笔记 显示和隐藏 对象的属性标志位 配置。 [^2]: LVGL 控件之基础对象lv_obj)。 [^3]: LVGL学习(二)——控件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值