部件创造API函数:
lv_obj_t* obj1 = lv_btn_create(lv_scr_act());
部件大小(size)设置相关API函数:
-
设置宽度:lv_obj_set_width(obj, new_width);
-
设置高度:lv_obj_set_height(obj, new_height);
-
同时设置宽度、高度:lv_obj_set_size(obj, new_width, new_height);
部件位置(position)设置相关API函数:
-
设置X轴坐标:lv_obj_set_x(obj, new_x);
-
设置Y轴坐标:lv_obj_set_y(obj, new_y);
-
同时设置X、Y轴坐标:lv_obj_set_pos(obj, new_x, new_y);
部件对齐(alignment)API函数及其使用:
(使用时一定要考虑范围,可能对齐之后对象超出了屏幕或者父对象范围)

"子对象" 只能使用灰色框内部的对齐方式;
"父对象" 才能使用灰色框外部的对齐方式;
"相互独立的对象" 能使用所有的对齐方式;
如果子对象使用了父对象才能使用的对齐方式,如OUT_LEFT_MID,那也只会在LEFT_MID的位置上。
相当于先做一个判断,如果是子对象调用函数,在进行判断是灰色框内外的函数,如果是内,则正常使用,如果是外,则转换成内的对齐方式;
if(子对象调用)
{
if(灰色框内)
正常调用;
else
强行调用灰色框内;
}
1.参照父对象对齐
- 参照父对象对齐:lv_obj_set_align(obj, LV_ALIGN_...);
obj:父对象;
LV_ALIGN_...:前面的(LV_ALIGN_)是对齐方式前缀,后面的(...)是具体的对齐方式,比如CENTER、TOP_MID,如上图对齐模式所示 - 参照父对象对齐,再进行偏移:lv_obj_align(obj, LV_ALIGN_..., x, y);
x:x方向偏移的距离;
y:y方向偏移的距离;
2.参照其他对象对齐(无父子关系)
参照其他对象对齐(无父子关系),再进行偏移:
lv_obj_align_to(obj_to_align, obj_referece, LV_ALIGN_..., x, y);
obj_to_align:需要对齐的对象;
obj_referece:基准对象;
3. 直接居中
lv_obj_center(obj);
这一类比较特殊,本质就是调用lv_obj_align(),使用比较局限!!!
部件样式(styles)
1. 如何给部件添加样式?
- 添加普通(全局)样式:
static lv_style_t style;/* 定义样式变量 */ lv_style_init(&style);/* 初始化样式 */ lv_style_set_bg_color(&style, lv_color_hex(0xf4b183));/* 设置背景颜色 */ lv_obj_t * obj = lv_obj_create(lv_scr_act());/* 创建一个部件 */ lv_obj_add_style(obj, & style, LV_STATE_DEFAULT);/* 设置部件的样式 */ - 添加本地(局部)样式:
lv_obj_t * obj = lv_obj_create(lv_scr_act()); /* 创建一个部件 */ lv_obj_set_style_bg_color(obj, lv_color_hex(0xf4b183),LV_STATE_DEFAULT);/* 设置部件的样式 */
普通(全局)样式对比本地(局部)样式虽然更加复杂,但是它可以通过样式变量 style 共享给其它部件
样式变量必须是 函数内的静态局部变量 或者是 动态全局变量,否则运行玩函数之后会被消除!!!
2. 什么时候样式会生效?
enum {
LV_STATE_DEFAULT = 0x0000, /* 默认状态 */
LV_STATE_CHECKED = 0x0001, /* 切换或选中状态 */
LV_STATE_FOCUSED = 0x0002, /* 通过键盘、编码器聚焦或通过触摸板、鼠标单击 */
LV_STATE_FOCUS_KEY = 0x0004, /* 通过键盘、编码器聚焦 */
LV_STATE_EDITED = 0x0008, /* 由编码器编辑 */
LV_STATE_HOVERED = 0x0010, /* 鼠标悬停(现在不支持)*/
LV_STATE_PRESSED = 0x0020, /* 已按下 */
LV_STATE_SCROLLED = 0x0040, /* 滚动状态 */
LV_STATE_DISABLED = 0x0080, /* 禁用状态 */
…
};
3. 有哪些样式属性可以设置?
- 大小(size);
- 位置(position);
- 背景(Background);
- 轮廓(Outline);
- 边框(Border);
- 阴影(Shadow);
- 其它(Others);
具体的样式属性及其使用方法,如边框宽度、颜色...可以去百问网LVGL文档或者官方LVGL文档进行查看
查找方法:1. 可以通过lv_style_set_bg_color()函数然后跳转到定义;
2.如果比较熟悉的话可以通过lv_style_set_...()的方式直接打出前缀,根据代码补全或自己打的方式补全;
4. 如何单独设置部件中某个部分的样式?

enum {
LV_PART_MAIN = 0x000000, /* 主体,像矩形一样的背景 */
LV_PART_SCROLLBAR = 0x010000, /* 滚动条 */
LV_PART_INDICATOR = 0x020000, /* 指示器,指示当前值 */
LV_PART_KNOB = 0x030000, /* 手柄或旋钮,用于调整参数值 */
LV_PART_SELECTED = 0x040000, /* 选项框,指示当前选择的选项 */
LV_PART_ITEMS = 0x050000, /* 相似的元素,例如单元格 */
LV_PART_TICKS = 0x060000, /* 刻度 */
LV_PART_CURSOR = 0x070000, /* 光标 */
};
具体的组成可以查看官方文档,不过这种核心或者基础组件一般LVGL都给你把示例(文档里面)的做好了,把这个开放出来是为了开发者可以根据自己的审美DIY或者优化!!!
事件(events)
事件(events)相关API函数:
添加事件:lv_obj_add_event_cb(obj, event_cb, event_code, user_data);
event_cb:事件回调函数;
event_code:事件类型;
user_data:用户数据;
删除事件:lv_obj_remove_event_cb(obj, event_cb);
不同的事件类型共用一个事件回调函数
/**
* @brief 同一事件回调函数处理多种事件
* @param *e :事件相关参数的集合,包含该事件的类型、源对象等所有信息
*/
static void event_cb( lv_event_t *e )
{
lv_event_code_t code = lv_event_get_code(e); /* 第一步:获取事件类型 */
if ( code == LV_EVENT_CLICKED ) /* 第二步:判断事件类型 */
{
printf("事件类型: 按下后释放\r\n"); /* 第三步:执行相应操作 */
}
else if ( code == LV_EVENT_LONG_PRESSED)
{
printf("事件类型:按下(长按)\r\n");
}
}
不同的事件类型可以共用一个事件回调函数,所以LVGL在回调函数里面提供一个形参lv_event_t *e ,可以通过函数 lv_event_get_code(e) 来知道本次触发的事件是什么类型的,如是长按触发的还是单击触发;同样可以通过这个函数知道导致触发的是哪个对象,如是父对象还是子对象。