LVGL学习(二)——控件
LVGL学习(一)——基础-CSDN博客
记录学习LVGL的过程,可能有疏漏,随着学习的深入,慢慢补充。如有侵权,联系删除。
一、Widget
LVGL用户界面的基本构建块。lv_obj_t。
1.1 属性
位置、尺寸、父级、样式、发出的事件、标志、特殊属性等
1.2 工作机制
1.2.1 父子结构
父级widget是子级widget的容器,父级可以拥有任意数量的子widget。
1.2.2 共同移动
子级widget会随着父级的位置变化,相对父级位置不变。
1.2.3 仅在父级上可见
如果子级部分或完全位于其父级之外,则外部的部分将不会被显示。
可以通过lv_obj_add_flag(widget,LV_OBJ_FLAG_OVERFLOW_VISIBLE)来允许子级在父级之外绘制。
1.2.4 创建和删除widgets
LVGL中,widgets可以在运行时动态创建和删除,只有当前存在的widgets会消耗RAM。
lv_obj_t * lv_<widget>_create(lv_obj_t * parent, <other parameters if any>);
void lv_obj_delete(lv_obj_t * widget);lv_obj_delete_async(widget);//lv_timer_handler()执行删除操作。
lv_obj_clean(widget); //移除 Widget 的所有子级
lv_obj_delete_delayed(widget, 1000); 在一段时间后删除 Widget,毫秒
lv_obj_null_on_delete(&widget);//Widget 被删除时将其指针设置为 NULL
二、Screens
2.1 属性
创建时不带父级。
- 在创建 Screen 时自动附加到 default_display;
- 自动占用关联显示的整个区域;
- 不能被移动。
Display|--- (一个或多个)/|\
Screen Widgets (Widget 树的根)|O (零个或多个)/|\
Child Widgets
2.2 创建Screens
lv_obj_t * scr1 = lv_obj_create(NULL);
lv_obj_delete(scr);//不要删除活跃的Screen
2.3 活跃Screen
任何时间只有一个Screen是活跃的。
当每个Display对象被创建时,会与之一起创建一个默认屏幕,并设置为其“Active Screen”。
lv_screen_active()//获取指向“Active Screen”的指针
lv_screen_load() 或 lv_screen_load_anim()//将一个 Screen 设置为“Active Screen”
2.4 加载Screen
lv_screen_load(scr1);//要加载新屏幕lv_screen_load_anim(scr, transition_type, time, delay, auto_del); //带动画加载新的屏幕
//auto_del设置为true,动画结束后自动删除旧屏幕。
存在以下过渡类型:
//LV_SCR_LOAD_ANIM_NONE:在 delay 毫秒后立即切换
//LV_SCR_LOAD_ANIM_OVER_LEFT,LV_SCR_LOAD_ANIM_OVER_RIGHT,LV_SCR_LOAD_ANIM_OVER_TOP 和 LV_SCR_LOAD_ANIM_OVER_BOTTOM:将新屏幕沿给定方向移动到当前屏幕上
//LV_SCR_LOAD_ANIM_OUT_LEFT,LV_SCR_LOAD_ANIM_OUT_RIGHT,LV_SCR_LOAD_ANIM_OUT_TOP 和 LV_SCR_LOAD_ANIM_OUT_BOTTOM:将旧屏幕沿给定方向移出当前屏幕
//LV_SCR_LOAD_ANIM_MOVE_LEFT,LV_SCR_LOAD_ANIM_MOVE_RIGHT,LV_SCR_LOAD_ANIM_MOVE_TOP 和 LV_SCR_LOAD_ANIM_MOVE_BOTTOM:将当前和新屏幕都沿给定方向移动
//LV_SCR_LOAD_ANIM_FADE_IN 和 LV_SCR_LOAD_ANIM_FADE_OUT:新屏幕覆盖旧屏幕或反之渐显
2.5 图层
当创建一个lv_display_t对象时,会创建4个 Screens(层)并附着到它上面。
-
Bottom Layer
-
Active Screen
-
Top Layer
-
System Layer
1、3、4独立于活跃的Screen
2.6 透明Screen
三、Parts
LV_PART_MAIN:类似背景的矩形
LV_PART_SCROLLBAR:滚动条
LV_PART_INDICATOR:指示器,例如用于滑块、进度条、开关或复选框的勾选框
LV_PART_KNOB:如同一个可以抓取来调整值的手柄
LV_PART_SELECTED:指示当前选定的选项或部分
LV_PART_ITEMS:如果 Widget 包含多个相似元素时使用(例如表格单元格)
LV_PART_CURSOR:标记特定位置,例如文本区域或图表的光标
LV_PART_CUSTOM_FIRST:可以从这里添加自定义部分。
四、States
lv_obj_add_state(widget, LV_STATE_...);
lv_obj_remove_state(widget, LV_STATE_...);LV_STATE_DEFAULT:正常、释放状态
LV_STATE_CHECKED:切换或选中状态
LV_STATE_FOCUSED:通过键盘或编码器聚焦,或者通过触摸板/鼠标点击聚焦
LV_STATE_FOCUS_KEY:仅通过键盘或编码器聚焦,而不是通过触摸板/鼠标
LV_STATE_EDITED:通过编码器编辑
LV_STATE_HOVERED:通过鼠标悬停(目前不支持)
LV_STATE_PRESSED:被按下
LV_STATE_SCROLLED:正在滚动
LV_STATE_DISABLED:禁用状态
LV_STATE_USER_1:自定义状态
LV_STATE_USER_2:自定义状态
LV_STATE_USER_3:自定义状态
LV_STATE_USER_4:自定义状态
五、Flags
lv_obj_add_flag(widget, LV_OBJ_FLAG_...); //启用
lv_obj_remove_flag(widget, LV_OBJ_FLAG_...); //禁用LV_OBJ_FLAG_HIDDEN 使 Widget 隐藏。(就像它完全不存在一样)
LV_OBJ_FLAG_CLICKABLE 使 Widget 可以通过输入设备点击
LV_OBJ_FLAG_CLICK_FOCUSABLE 点击时为 Widget 添加聚焦状态
LV_OBJ_FLAG_CHECKABLE 当 Widget 被点击时切换选中状态
LV_OBJ_FLAG_SCROLLABLE 使 Widget 可滚动
LV_OBJ_FLAG_SCROLL_ELASTIC 允许内部滚动但速度较慢
LV_OBJ_FLAG_SCROLL_MOMENTUM 当“抛出”Widget 时使其滚动更远
LV_OBJ_FLAG_SCROLL_ONE 仅允许滚动一个可停靠的子元素
LV_OBJ_FLAG_SCROLL_CHAIN_HOR 允许将水平滚动传播给父级
LV_OBJ_FLAG_SCROLL_CHAIN_VER 允许将垂直滚动传播给父级
LV_OBJ_FLAG_SCROLL_CHAIN 简单包装 (LV_OBJ_FLAG_SCROLL_CHAIN_HOR | LV_OBJ_FLAG_SCROLL_CHAIN_VER)
LV_OBJ_FLAG_SCROLL_ON_FOCUS 聚焦时自动滚动 Widget 以使其可见
LV_OBJ_FLAG_SCROLL_WITH_ARROW 允许使用箭头键滚动聚焦的 Widget
LV_OBJ_FLAG_SNAPPABLE 如果父级启用了滚动停靠,则可以停靠到此 Widget
LV_OBJ_FLAG_PRESS_LOCK 即使按压滑出 Widget 也保持按压状态
LV_OBJ_FLAG_EVENT_BUBBLE 向父级传播事件
LV_OBJ_FLAG_GESTURE_BUBBLE 向父级传播手势
LV_OBJ_FLAG_ADV_HITTEST 允许执行更准确的点击测试。例如,考虑圆角
LV_OBJ_FLAG_IGNORE_LAYOUT 使 Widget 不受布局定位影响
LV_OBJ_FLAG_FLOATING 当父级滚动时不滚动该 Widget,并忽略布局
LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS 启用发送 LV_EVENT_DRAW_TASK_ADDED 事件
LV_OBJ_FLAG_OVERFLOW_VISIBLE 不裁剪子元素的内容至父级边界
LV_OBJ_FLAG_FLEX_IN_NEW_TRACK 在此项目上开始一个新的 flex 轨道
LV_OBJ_FLAG_LAYOUT_1 自定义标志,由布局自由使用
LV_OBJ_FLAG_LAYOUT_2 自定义标志,由布局自由使用
LV_OBJ_FLAG_WIDGET_1 自定义标志,由 widget 自由使用
LV_OBJ_FLAG_WIDGET_2 自定义标志,由 widget 自由使用
LV_OBJ_FLAG_USER_1 自定义标志,由用户自由使用
LV_OBJ_FLAG_USER_2 自定义标志,由用户自由使用
LV_OBJ_FLAG_USER_3 自定义标志,由用户自由使用
LV_OBJ_FLAG_USER_4 自定义标志,由用户自由使用
六、Events
Events from Input Devices:LV_EVENT_PRESSED Widget 已被按下。
LV_EVENT_PRESSING Widget 正在被按下(在按压期间持续发送)。
LV_EVENT_PRESS_LOST Widget 仍然被按下,但滑动的光标/手指离开了 Widget。
LV_EVENT_SHORT_CLICKED Widget 被短时间按下,然后释放。如果滚动则不发送。
LV_EVENT_SINGLE_CLICKED 在小距离和短时间内第一次短点击时发送。
LV_EVENT_DOUBLE_CLICKED 在小距离和短时间内第二次短点击时发送。
LV_EVENT_TRIPLE_CLICKED 在小距离和短时间内第三次短点击时发送。
LV_EVENT_LONG_PRESSED 对象已被按下至少 long_press_time。如果滚动则不发送。
LV_EVENT_LONG_PRESSED_REPEAT 在 long_press_time 后每 long_press_repeat_time 毫秒发送一次。如果滚动则不发送。
LV_EVENT_CLICKED 如果没有滚动(不论长按与否),在释放时发送。
LV_EVENT_RELEASED 在 Widget 被释放的所有情况下发送。
LV_EVENT_SCROLL_BEGIN 滚动开始。事件参数是指向滚动动画的指针。可以修改。
LV_EVENT_SCROLL_THROW_BEGIN 当滚动开始时接收。
LV_EVENT_SCROLL_END 滚动结束。
LV_EVENT_SCROLL 滚动中
LV_EVENT_GESTURE 检测到手势。通过 lv_indev_get_gesture_dir(lv_indev_active()); 获取手势。
LV_EVENT_KEY 键被发送到 Widget。通过 lv_indev_get_key(lv_indev_active()); 获取键。
LV_EVENT_FOCUSED Widget 收到焦点,
LV_EVENT_DEFOCUSED Widget 失去了焦点。
LV_EVENT_LEAVE Widget 失去了焦点但仍然被选中。
LV_EVENT_HIT_TEST 执行高级命中测试。Special Events:
LV_EVENT_VALUE_CHANGED 当启用了 LV_OBJ_FLAG_CHECKABLE 标志并且 Widget 被点击(在切换到/从选中状态过渡时)Drawing Events:
LV_EVENT_DRAW_MAIN 执行主部分的绘制
LV_EVENT_DRAW_MAIN_BEGIN 开始绘制主部分
LV_EVENT_DRAW_MAIN_END 完成绘制主部分
LV_EVENT_DRAW_POST 执行后绘制阶段(当所有子元素都被绘制后)
LV_EVENT_DRAW_POST_BEGIN 开始后绘制阶段(当所有子元素都被绘制后)
LV_EVENT_DRAW_POST_END 完成后绘制阶段(当所有子元素都被绘制后)Other Events:
LV_EVENT_DELETE 对象正在被删除
LV_EVENT_CHILD_CHANGED 子元素被移除、添加,或者其大小、位置发生了变化
LV_EVENT_CHILD_CREATED 子元素被创建,总是会冒泡到所有父级
LV_EVENT_CHILD_DELETED 子元素被删除,总是会冒泡到所有父级
LV_EVENT_SIZE_CHANGED 对象坐标/大小已更改
LV_EVENT_STYLE_CHANGED 对象的样式已更改
LV_EVENT_LAYOUT_CHANGED 由于布局重新计算(当容器具有 flex 或 grid 布局样式时),子元素的位置发生了变化
LV_EVENT_GET_SELF_SIZE 获取 widget 的内部尺寸
七、Keys
LV_OBJ_FLAG_CHECKABLE
LV_KEY_RIGHT,LV_KEY_UP,LV_KEY_LEFT,LV_KEY_DOWN
LV_OBJ_FLAG_SCROLLABLLE