LVGL- 基础对象(lv_obj_t
- ■ LVGL-border-box 模型
- ■ LVGL-基础对象(lv_obj_t)就是一个矩形
- ■ LVGL-弹性增长值
- ■ LVGL-扩展点击区域
- ■ LVGL-父和子对象的关系
- ■ LVGL-图层设到前台(foreground)展示
- ■ LVGL-清除滚动条
- ■ LVGL-基础对象API 函数
- ■ 参考博主链接
■ LVGL-border-box 模型
属性 | 描述 |
---|---|
边界(bounding) | 元素的宽度/高度围起来的区域(整个盒子)。 |
边框(border) | 边框有大小和颜色等属性(相当于盒子的厚度和它的颜色)。 |
填充(padding) | 对象两侧与其子对象之间的空间(盒子的填充物)。 |
内容(content) | 如果边界框按边框宽度和填充的大小缩小,则显示其大小的内容区域(盒子实际装东西的区域)。 |
轮廓(outline) | LVGL中没有外边距(margin)的概念(盒子之间的距离),确认代之的是轮廓(outline)。 它是绘制于元素(盒子)周围的一条线,它不占据空间,位于边框边缘的外围,可起到突出元素(盒子)的作用。 在浏览器里,当鼠标点击或使用Tab键让一个选项或者一个图片获得焦点的时候,这个元素就会多了一个轮廓框围绕。轮廓(outline) |
LVGL的盒子模型是我们理解对象(部件)的组成,修改对象的样式,实现对对象的布局、处理对象排列等等的关键。
盒子模型模型实例对比
/******************/
lv_obj_t* obj1 = lv_line_create(ui_ContainerRight);
static lv_point_t line_points[] = { {50, 50}, {150, 50} };
lv_line_set_points(obj1, line_points, sizeof(line_points) / sizeof(lv_point_t));
/******************/
lv_obj_t* obj2 = lv_obj_create(ui_ContainerRight);
lv_obj_set_pos(obj2,50,70);
lv_obj_set_width(obj2, 100);
lv_obj_set_height(obj2, 50);
lv_obj_set_style_line_color(obj2, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_line_width(obj2, 10, LV_PART_MAIN | LV_STATE_DEFAULT );
lv_obj_set_style_line_opa(obj2, 255 ,LV_PART_MAIN | LV_STATE_DEFAULT );
lv_obj_set_style_line_rounded(obj2, 255 ,LV_PART_MAIN | LV_STATE_DEFAULT );
/******************/
lv_obj_t* obj3 = lv_obj_create(ui_ContainerRight);
lv_obj_set_pos(obj3,50,130);
lv_obj_set_width(obj3, 100);
lv_obj_set_height(obj3, 50);
lv_obj_set_style_border_color(obj3, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(obj3, 10, LV_PART_MAIN | LV_STATE_DEFAULT );
lv_obj_set_style_border_opa(obj3, 255 ,LV_PART_MAIN | LV_STATE_DEFAULT );
/******************/
lv_obj_t* obj4 = lv_obj_create(ui_ContainerRight);
lv_obj_set_pos(obj4,50,200);
lv_obj_set_width(obj4, 100);
lv_obj_set_height(obj4, 50);
lv_obj_set_style_outline_color(obj4, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_outline_width(obj4, 10, LV_PART_MAIN | LV_STATE_DEFAULT );
lv_obj_set_style_outline_opa(obj4, 255 ,LV_PART_MAIN | LV_STATE_DEFAULT );
/******************/
lv_obj_t* obj5 = lv_obj_create(ui_ContainerRight);
lv_obj_set_pos(obj5,50,270);
lv_obj_set_width(obj5, 100);
lv_obj_set_height(obj5, 50);
lv_obj_set_style_arc_color(obj5, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_arc_width(obj5, 10, LV_PART_MAIN | LV_STATE_DEFAULT );
lv_obj_set_style_arc_opa(obj5, 255 ,LV_PART_MAIN | LV_STATE_DEFAULT );
显示结果:
边框 宽度
lv_obj_set_style_border_width(pppppppp2, 10, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_t *pppppppp = lv_label_create(ui_EBKV_Containe_Body);
lv_obj_set_pos(pppppppp,100,100);
lv_obj_set_size(pppppppp, 130, 60);
lv_label_set_text(pppppppp, "book 1");
lv_obj_set_style_text_color(pppppppp, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_opa(pppppppp, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(pppppppp, &lv_font_montserrat_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(pppppppp, lv_color_hex(0x4ea7d1), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(pppppppp, 255, LV_PART_MAIN | LV_STATE_DEFAULT); //加上这句上面有效果
lv_obj_set_style_border_color(pppppppp, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(pppppppp, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_opa(pppppppp, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_t *pppppppp2 = lv_label_create(ui_EBKV_Containe_Body);
lv_obj_set_pos(pppppppp2,100,170);
lv_obj_set_size(pppppppp2, 130, 60);
lv_label_set_text(pppppppp2, "book 2");
lv_obj_set_style_text_color(pppppppp2, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_opa(pppppppp2, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(pppppppp2, &lv_font_montserrat_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(pppppppp2, lv_color_hex(0x4ea7d1), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(pppppppp2, 255, LV_PART_MAIN | LV_STATE_DEFAULT); //加上这句上面有效果
lv_obj_set_style_border_color(pppppppp2, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(pppppppp2, 10, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_opa(pppppppp2, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
pad设置宽度
lv_obj_set_style_pad_top(pppppppp, 10, LV_PART_MAIN);
lv_obj_set_style_pad_left(pppppppp, 10, LV_PART_MAIN);
lv_obj_set_style_pad_all(pppppppp, 10, LV_PART_MAIN);
int fontHeight1 = lv_font_get_line_height(&lv_font_montserrat_22);
int verPad2 = (60 - fontHeight1)/2;
lv_obj_set_style_pad_top(pppppppp, verPad2, 0);
int textWidth1 = lv_txt_get_width("book 1", strlen("book 1"), &lv_font_montserrat_22, 1,LV_TEXT_FLAG_NONE);
int horPad1 = (130 - textWidth1)/2;
lv_obj_set_style_pad_left(pppppppp, horPad1, 0);
lv_obj_set_style_pad_all(pppppppp, 10, LV_PART_MAIN);
文本居中
lv_obj_set_style_pad_top(pppppppp, verPad2, 0);
lv_obj_set_style_pad_left(pppppppp, horPad1, 0);
lv_obj_t *pppppppp = lv_label_create(ui_EBKV_Containe_Body);
lv_obj_set_pos(pppppppp,100,100);
lv_obj_set_size(pppppppp, 130, 60);
lv_label_set_text(pppppppp, "book 1");
lv_obj_set_style_text_color(pppppppp, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_opa(pppppppp, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(pppppppp, &lv_font_montserrat_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(pppppppp, lv_color_hex(0x4ea7d1), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(pppppppp, 255, LV_PART_MAIN | LV_STATE_DEFAULT); //加上这句上面有效果
lv_obj_set_style_border_color(pppppppp, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(pppppppp, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_opa(pppppppp, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
int fontHeight1 = lv_font_get_line_height(&lv_font_montserrat_22);
int verPad2 = (60 - fontHeight1)/2;
lv_obj_set_style_pad_top(pppppppp, verPad2, 0);
int textWidth1 = lv_txt_get_width("book 1", strlen("book 1"), &lv_font_montserrat_22, 1,LV_TEXT_FLAG_NONE);
int horPad1 = (130 - textWidth1)/2;
lv_obj_set_style_pad_left(pppppppp, horPad1, 0);
lv_obj_t *pppppppp2 = lv_label_create(ui_EBKV_Containe_Body);
lv_obj_set_pos(pppppppp2,100,170);
lv_obj_set_size(pppppppp2, 130, 60);
lv_label_set_text(pppppppp2, "book 2");
lv_obj_set_style_text_color(pppppppp2, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_opa(pppppppp2, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_text_font(pppppppp2, &lv_font_montserrat_22, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(pppppppp2, lv_color_hex(0x4ea7d1), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(pppppppp2, 255, LV_PART_MAIN | LV_STATE_DEFAULT); //加上这句上面有效果
lv_obj_set_style_border_color(pppppppp2, lv_color_hex(0x00), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(pppppppp2, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_opa(pppppppp2, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
■ LVGL-基础对象(lv_obj_t)就是一个矩形
示例一:
在这里插入代码片
■ LVGL-(lv_obj_t)基本属性
■ LVGL-(lv_obj_t)大小
//大小
lv_obj_set_width(obj, 200);
lv_obj_set_width(btn, lv_pct(50)) //lv_pct(value) 将值转换为百分比
lv_obj_set_width(btn, LV_SIZE_CONTENT) //设置对象的宽度/高度以涉及所有子项的特殊值
lv_obj_set_height(obj, 100);
lv_obj_set_height(obj, lv_pct(100)); //百分比值是根据父内容区域的大小计算的。例如将对象的高度设置为屏幕高度:
lv_obj_set_size(obj, 200, 100); //Or in one function
lv_obj_update_layout(obj) //如果您需要获取对象的任何坐标并且坐标刚刚更改,则需要强制 LVGL 重新计算坐标。
scr_act_width() //获取宽度
scr_act_height() //获取高度
lv_obj_get_width(obj) //获取宽度
lv_obj_get_height(obj) //获取高度
lv_obj_update_layout(obj_left); /* 手动更新物体的参数 */
■ LVGL-(lv_obj_t)Flag
enum {
LV_OBJ_FLAG_HIDDEN = (1L << 0), /**< Make the object hidden. (Like it wasn't there at all)*/
LV_OBJ_FLAG_CLICKABLE = (1L << 1), /**< Make the object clickable by the input devices*/
LV_OBJ_FLAG_CLICK_FOCUSABLE = (1L << 2), /**< Add focused state to the object when clicked*/
LV_OBJ_FLAG_CHECKABLE = (1L << 3), /**< Toggle checked state when the object is clicked*/
LV_OBJ_FLAG_SCROLLABLE = (1L << 4), /**< Make the object scrollable*/
LV_OBJ_FLAG_SCROLL_ELASTIC = (1L << 5), /**< Allow scrolling inside but with slower speed*/
LV_OBJ_FLAG_SCROLL_MOMENTUM = (1L << 6), /**< Make the object scroll further when "thrown"*/
LV_OBJ_FLAG_SCROLL_ONE = (1L << 7), /**< Allow scrolling only one snappable children*/
LV_OBJ_FLAG_SCROLL_CHAIN_HOR = (1L << 8), /**< Allow propagating the horizontal scroll to a parent*/
LV_OBJ_FLAG_SCROLL_CHAIN_VER = (1L << 9), /**< Allow propagating the vertical scroll to a parent*/
LV_OBJ_FLAG_SCROLL_CHAIN = (LV_OBJ_FLAG_SCROLL_CHAIN_HOR | LV_OBJ_FLAG_SCROLL_CHAIN_VER),
LV_OBJ_FLAG_SCROLL_ON_FOCUS = (1L << 10), /**< Automatically scroll object to make it visible when focused*/
LV_OBJ_FLAG_SCROLL_WITH_ARROW = (1L << 11), /**< Allow scrolling the focused object with arrow keys*/
LV_OBJ_FLAG_SNAPPABLE = (1L << 12), /**< If scroll snap is enabled on the parent it can snap to this object*/
LV_OBJ_FLAG_PRESS_LOCK = (1L << 13), /**< Keep the object pressed even if the press slid from the object*/
LV_OBJ_FLAG_EVENT_BUBBLE = (1L << 14), /**< Propagate the events to the parent too*/
LV_OBJ_FLAG_GESTURE_BUBBLE = (1L << 15), /**< Propagate the gestures to the parent*/
LV_OBJ_FLAG_ADV_HITTEST = (1L << 16), /**< Allow performing more accurate hit (click) test. E.g. consider rounded corners.*/
LV_OBJ_FLAG_IGNORE_LAYOUT = (1L << 17), /**< Make the object position-able by the layouts*/
LV_OBJ_FLAG_FLOATING = (1L << 18), /**< Do not scroll the object when the parent scrolls and ignore layout*/
LV_OBJ_FLAG_OVERFLOW_VISIBLE = (1L << 19), /**< Do not clip the children's content to the parent's boundary*/
LV_OBJ_FLAG_LAYOUT_1 = (1L << 23), /**< Custom flag, free to use by layouts*/
LV_OBJ_FLAG_LAYOUT_2 = (1L << 24), /**< Custom flag, free to use by layouts*/
LV_OBJ_FLAG_WIDGET_1 = (1L << 25), /**< Custom flag, free to use by widget*/
LV_OBJ_FLAG_WIDGET_2 = (1L << 26), /**< Custom flag, free to use by widget*/
LV_OBJ_FLAG_USER_1 = (1L << 27), /**< Custom flag, free to use by user*/
LV_OBJ_FLAG_USER_2 = (1L << 28), /**< Custom flag, free to use by user*/
LV_OBJ_FLAG_USER_3 = (1L << 29), /**< Custom flag, free to use by user*/
LV_OBJ_FLAG_USER_4 = (1L << 30), /**< Custom flag, free to use by user*/
};
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); //隐藏
lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); //显示
■ LVGL-(lv_obj_t)位置 pos
//位置
lv_obj_set_x(obj, 10);
lv_obj_set_y(obj, 20);
lv_obj_set_pos(obj, 10, 20); //Or in one function
lv_coord_t lv_obj_get_x2(const lv_obj_t * obj)
lv_area_t coords;
lv_obj_get_coords(obj,&coords); // 获取obj位置
printf("%d,%d,%d,%d\n",coords.x1,coords.y1,coords.x2,coords.y2);
//获取输入设备坐标
lv_indev_t* indev = lv_indev_get_act(); //获取输入设备
if (indev == NULL) return;
lv_point_t lv_point;
lv_indev_get_point(indev, &lv_point);
printf("[%s] lv_point.x = %d lv_point.y = %d \n", __func__, lv_point.x, lv_point.y);
■ LVGL-(lv_obj_t)对齐 align
//对齐
lv_obj_set_align(obj, align); //lv_obj_set_align(obj, align);
lv_obj_align(obj, align, x, y); //更改对齐方式并设置新坐标:
示例一:右对齐
对齐问题 点 没有完全重合
lv_obj_t *parent = lv_obj_create(lv_scr_act());
lv_obj_set_size(parent,100,100);
lv_obj_set_style_bg_color(parent,lv_palette_main(LV_PALETTE_BLUE),0);
lv_obj_align(parent,LV_ALIGN_CENTER,0,0);
lv_obj_t *child = lv_obj_create(lv_scr_act());
lv_obj_set_size(child,50,50);
lv_obj_set_style_bg_color(child,lv_palette_main(LV_PALETTE_GREEN),0);
lv_obj_align_to(child,parent,LV_ALIGN_BOTTOM_MID,0,0);
没有完全对齐问题
==添加 lv_obj_set_style_pad_all(parent,0,0); == 后的效果
■ LVGL-(lv_obj_t)样式 style
■ 设置样式函数
设置颜色后一定要设置_bg_opa 才起效
lv_obj_set_style_bg_color(ui_ContainerBody, lv_color_hex(0x73C3EE), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(ui_ContainerBody, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_align_to(ui_ContainerBody,ui_Title,LV_ALIGN_OUT_BOTTOM_MID,0,0);
■ 设置样式枚举
■ 设置样式(大小,位置,背景,轮廓,边框,阴影,其他)
■ 设置样式- 背景颜色 bg_color
void lv_style_set_bg_color(lv_style_t * style, lv_color_t value); //设置背景颜色
void lv_style_set_bg_color_filtered(lv_style_t * style, lv_color_t value); //设置背景过滤颜色
void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value); //设置背景透明度
设置背景的不透明度。值0,
LV_OPA_0或LV_OPA_TRANSP 表示完全透明,
256,LV_OPA_100 或 LV_OPA_COVER 表示完全覆盖,其他值或
LV_OPA_10、LV_OPA_20 等表示半透明。
void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value); //设置背景下半部颜色
void lv_style_set_bg_grad_color_filtered(lv_style_t * style, lv_color_t value);//设置背景下半部过滤颜色
void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value); //设置背景下半部颜色填充方向
void lv_style_set_bg_main_stop(lv_style_t * style, lv_coord_t value); //主色停止
void lv_style_set_bg_grad_stop(lv_style_t * style, lv_coord_t value); //下半部色停止
■ 设置样式- 背景图片 bg_img
void lv_style_set_bg_img_src(lv_style_t * style, const void * value); //设置背景图片
void lv_style_set_bg_img_opa(lv_style_t * style, lv_opa_t value); //设置背景图片透明度
void lv_style_set_bg_img_recolor(lv_style_t * style, lv_color_t value); //设置背景图片重着色
void lv_style_set_bg_img_recolor_filtered(lv_style_t * style, lv_color_t value);//设置背景图片重着色过滤色
void lv_style_set_bg_img_recolor_opa(lv_style_t * style, lv_opa_t value); //设置背景图片重着色透明度
void lv_style_set_bg_img_tiled(lv_style_t * style, bool value); //设置背景图片平铺
■ 设置样式- 内边距 pad_top,left,right
本地
lv_obj_set_style_pad_top(ui_LabelLine3_2, 10, LV_PART_MAIN | LV_STATE_DEFAULT); //设置本地顶部内边距
lv_obj_set_style_pad_bottom(ui_LabelLine3_2, 10, LV_PART_MAIN | LV_STATE_DEFAULT); //设置本地顶部内边距
lv_obj_set_style_pad_left(ui_LabelLine3_2, 10, LV_PART_MAIN | LV_STATE_DEFAULT); //设置本地左边内边距
lv_obj_set_style_pad_right(ui_LabelLine3_2, 10, LV_PART_MAIN | LV_STATE_DEFAULT); //设置本地右边内边距
static inline void lv_obj_set_style_pad_hor(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);//水平方向- 左右两边相等
static inline void lv_obj_set_style_pad_ver(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);//垂直方向
static inline void lv_obj_set_style_pad_gap(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);//间隔
static inline void lv_obj_set_style_pad_all(struct _lv_obj_t * obj, lv_coord_t value, lv_style_selector_t selector);//全部
样式
static inline void lv_style_set_pad_all(lv_style_t * style, lv_coord_t value); //四边内边距
static inline void lv_style_set_pad_hor(lv_style_t * style, lv_coord_t value); //水平内边距 左右相同
static inline void lv_style_set_pad_ver(lv_style_t * style, lv_coord_t value); //竖直内边距 上下相同
static inline void lv_style_set_pad_gap(lv_style_t * style, lv_coord_t value); //差距内边距 行列相同
void lv_style_set_pad_top(lv_style_t * style, lv_coord_t value); //设置样式顶部内边距
void lv_style_set_pad_bottom(lv_style_t * style, lv_coord_t value); //设置样式底部内边距
void lv_style_set_pad_left(lv_style_t * style, lv_coord_t value); //设置样式左边内边距
void lv_style_set_pad_right(lv_style_t * style, lv_coord_t value); //设置样式右边内边距
void lv_style_set_pad_row(lv_style_t * style, lv_coord_t value); //设置样式内部对象之间的行间距由布局使用
void lv_style_set_pad_column(lv_style_t * style, lv_coord_t value); //设置样式内部对象之间的列间距由布局使用
演示:
/*************************************************
* 函数名称 : lv_style_pad 样式设置边距
* 参 数 : 无
* 函数功能 : 设置样式圆角、尺寸、内边距、位置
*************************************************/
void lv_style_pad(void)
{
static lv_style_t style; //创建样式
lv_style_init(&style); //初始化样式
lv_style_set_radius(&style,5); //设置样式的圆角
lv_style_set_width(&style,150); //设置样式的宽度
lv_style_set_height(&style, LV_SIZE_CONTENT); //设置样式的高度 我的理解是自适应高度
lv_style_set_pad_ver(&style,20); //设置样式的上下内边距
lv_style_set_pad_left(&style,5); //设置左边距
lv_style_set_x(&style,lv_pct(50)); //设置样式的x位置 ,基准点左上角
lv_style_set_y(&style,80); //设置样式的y位置
lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建对象
lv_obj_add_style(obj,&style,0); //设置对象的样式 默认模式
lv_obj_t * label = lv_label_create(obj); //创建Label obj 为父对象
lv_label_set_text(label,"Hello ESP32"); //设置Label显示
}
■ 设置样式- 内边距 pad_row ,pad_column
static void lv_example_flex_5(void)
{
lv_obj_t* cont = lv_obj_create(lv_scr_act()); //当前活动界面创建obj对象
lv_obj_set_size(cont, 300, 220); // 设置大小
lv_obj_center(cont); // 居中显示
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW_WRAP); //LV_FLEX_FLOW_ROW_WRAP方式排列
uint32_t i;
for (i = 0; i < 9; i++) {
lv_obj_t* obj = lv_obj_create(cont); //在cont对象上创建obj对象
lv_obj_set_size(obj, 70, LV_SIZE_CONTENT); // 设置大小
lv_obj_t* label = lv_label_create(obj); //在obj对象上创建label
lv_label_set_text_fmt(label, "%d", i); //设置显示内容
lv_obj_center(label); // 居中显示
}
lv_anim_t a;
lv_anim_init(&a); //初时化动画变量
lv_anim_set_var(&a, cont); // 设置动画操作对象
lv_anim_set_values(&a, 0, 10); // 设置动画start,end值
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);// 设置重复次数为无限重复
lv_anim_set_exec_cb(&a, row_gap_anim); // 注册动画执行回调函数
lv_anim_set_time(&a, 500); // 设置动画持续时间
lv_anim_set_playback_time(&a, 500); // 设置动画回播时间
lv_anim_start(&a); // 启动动画
lv_anim_set_exec_cb(&a, column_gap_anim); // 注册动画执行回调函数
lv_anim_set_time(&a, 3000); // 设置动画持续时间
lv_anim_set_playback_time(&a, 3000); // 设置动画回播时间
lv_anim_start(&a); // 启动动画
}
■ 设置样式- 边框 pad_all
设置lv_list前
设置lv_list后
lv_obj_set_style_pad_all(sowye_my_dev_list, 0, LV_PART_MAIN);//全部
■ 设置样式- 边框 border_XXX
本地
lv_obj_set_style_border_color(ebook_btn[i], lv_color_hex(0xFF0000), 0);
lv_obj_set_style_border_width(ebook_btn[i],6,0);
lv_obj_set_style_border_side(ebook_btn[i],LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT,0);
lv_obj_set_style_border_opa(ebook_btn[i],255,LV_STATE_DEFAULT);
样式
void lv_style_set_border_color(lv_style_t * style, lv_color_t value); //设置样式边框颜色
void lv_style_set_border_color_filtered(lv_style_t * style, lv_color_t value); //设置样式边框过滤颜色
void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value); //设置样式边框透明度
void lv_style_set_border_width(lv_style_t * style, lv_coord_t value); //设置样式边框宽度
void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value); //设置样式边框显示范围
void lv_style_set_border_post(lv_style_t * style, bool value); //设置样式边框柱
LV_BORDER_SIDE_NONE //无边框
LV_BORDER_SIDE_BOTTOM //底部边框
LV_BORDER_SIDE_TOP //顶部边框
LV_BORDER_SIDE_LEFT //左边边框
LV_BORDER_SIDE_RIGHT //右边边框
LV_BORDER_SIDE_FULL //四周边框
LV_BORDER_SIDE_INTERNAL //边境一侧内部
lv_style_set_radius(&style, 5);
lv_style_set_bg_opa(&style, LV_OPA_COVER);
lv_style_set_bg_color(&style, lv_palette_lighten(LV_PALETTE_GREY, 3));
lv_style_set_border_width(&style, 2);
lv_style_set_border_color(&style, lv_palette_main(LV_PALETTE_BLUE));
■ 设置样式- 阴影 shadow_xxx
lv_obj_set_style_shadow_ofs_x(ui_prev_page, 6, LV_PART_MAIN);
lv_obj_set_style_shadow_ofs_y(ui_prev_page, 6, LV_PART_MAIN);
lv_obj_set_style_shadow_color(ui_prev_page, lv_color_hex(0x3d89ad), LV_PART_MAIN);
lv_obj_set_style_shadow_opa(ui_prev_page, 177, LV_PART_MAIN);
■ 设置样式- outline
可以用遥控器和按键 改变焦点,有效。
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, /* 禁用状态 */
};
lv_obj_set_style_border_color(obj, lv_color_white(), LV_PART_MAIN | LV_STATE_FOCUS_KEY);
lv_obj_set_style_border_width(obj, 5, LV_PART_MAIN | LV_STATE_FOCUS_KEY);
lv_obj_set_style_border_opa(obj, 255, LV_PART_MAIN | LV_STATE_FOCUS_KEY);
lv_obj_set_style_outline_color(obj, lv_color_white(), LV_PART_MAIN | LV_STATE_FOCUS_KEY);
lv_obj_set_style_outline_width(obj, 5, LV_PART_MAIN | LV_STATE_FOCUS_KEY);
lv_obj_set_style_outline_opa(obj, 255, LV_PART_MAIN | LV_STATE_FOCUS_KEY);
实例一 outline
static lv_style_t style; //创建style
lv_style_init(&style); //初始化style
lv_style_set_radius(&style,5); //设置样式的圆角
lv_style_set_opa(&style,LV_OPA_COVER); //设置样式背景透明度
lv_style_set_bg_color(&style,lv_palette_lighten(LV_PALETTE_GREY,1)); //设置样式背景颜色
lv_style_set_outline_width(&style,2); //设置样式轮廓的宽度
lv_style_set_outline_color(&style,lv_palette_main(LV_PALETTE_BLUE)); //设置样式轮廓颜色
lv_style_set_outline_pad(&style,5); //设置样式轮廓的边距
lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建对象
lv_obj_add_style(obj,&style, 0); //将样式添加到对象中
lv_obj_center(obj); //居中对象
显示结果;
实例二 border
static lv_style_t style; //创建style
lv_style_init(&style); //初始化style
lv_style_set_radius(&style,5); //设置样式的圆角
lv_style_set_opa(&style,LV_OPA_50); //设置样式背景透明度
lv_style_set_bg_color(&style,lv_palette_lighten(LV_PALETTE_BLUE_GREY,1)); //设置样式背景颜色
lv_style_set_border_color(&style,lv_palette_main(LV_PALETTE_BLUE)); //设置样式边框颜色
lv_style_set_border_width(&style,5); //设置样式边框宽度
lv_style_set_border_opa(&style,LV_OPA_30); //设置样式边框透明度
lv_style_set_border_side(&style,LV_BORDER_SIDE_FULL); //设置样式边框显示范围
lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建对象
lv_obj_add_style(obj,&style, 0); //将样式添加到对象中
lv_obj_center(obj); //居中对象
实例三 border左上下右边框
lv_obj_set_style_radius(ui_ImageBig,10,LV_PART_MAIN);
lv_obj_set_style_border_color(ui_ImageBig, lv_color_white(), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_width(ui_ImageBig, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_opa(ui_ImageBig, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_border_side(ui_ImageBig,LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_LEFT,LV_PART_MAIN | LV_STATE_DEFAULT);
实例四 实现圆角功能
lv_obj_t* ui_main = lv_obj_create(lv_scr_act());
lv_obj_remove_style_all(ui_main);
lv_obj_set_size(ui_main, 400, 400);
lv_obj_set_style_bg_color(ui_main, lv_color_hex(0xdc7878), LV_PART_MAIN);
lv_obj_set_style_bg_opa(ui_main, 255, LV_PART_MAIN);
lv_obj_set_style_radius(ui_main, 12, LV_PART_MAIN);
lv_obj_set_y(ui_main, 76);
lv_obj_center(ui_main);
lv_obj_t* ui_radius = lv_obj_create(ui_main); // 矩形
lv_obj_remove_style_all(ui_radius);
lv_obj_set_size(ui_radius, 400, 12);
lv_obj_set_style_bg_color(ui_radius, lv_color_hex(0xdc7878), LV_PART_MAIN);
lv_obj_set_style_bg_opa(ui_radius, 255, LV_PART_MAIN);
lv_obj_set_align(ui_radius, LV_ALIGN_BOTTOM_LEFT);
■ 设置控件子控件样式
知识点一:要单独设置某个控件的样式怎么区分呢? LVGL 为每个控件都有定义某个部分
知识点二:这里可以查询每个控件对应的枚举值。
示例一:设置控件两个子控件两个枚举的背景色
结果:指示器手柄和滑块都设置为绿色
示例二:使用样式设置对象大小
使用样式设置对象大小的示例:
static lv_style_t style;
lv_style_init(&style);
lv_style_set_width(&style, 100);
lv_obj_t * btn = lv_btn_create(lv_scr_act());
lv_obj_add_style(btn, &style, LV_PART_MAIN);
■ LVGL-(lv_obj_t)事件
■ 点击事件
■ 一个obj添加多个事回调函数
static void scr_event_handle(lv_event_t* e){
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *target = lv_event_get_target(e);
char *cur_ssid = NULL;
printf("shine 12 %s,%d,code = %d\n", __func__, __LINE__, code);
if (code == LV_EVENT_SCREEN_LOADED) {
}
}
static void mainpage_scr_event_handle(lv_event_t *e){
lv_event_code_t code = lv_event_get_code(e);
printf("shine 13 %s,%d,code = %d\n", __func__, __LINE__, code);
if(code == LV_EVENT_SCREEN_LOADED){
projector_set_some_sys_param(P_CUR_CHANNEL, SCREEN_CHANNEL_MAIN_PAGE);
lv_group_set_default(main_page_g);
}else if(code == LV_EVENT_SCREEN_UNLOADED){
win_msgbox_msg_close();
}
}
lv_obj_add_event_cb(main_page_scr, scr_event_handle, LV_EVENT_ALL, 0);
lv_obj_add_event_cb(main_page_scr, mainpage_scr_event_handle, LV_EVENT_ALL, 0);
■ 多个对象可以使用一个回调函数
多个对象可以使用一个回调函数
void my_event_cb(lv_obj_t * obj, lv_event_t event)
{
switch(event){
case LV_EVENT_PRESSED: /* 对象被按下 */
printf("Pressed\n");
break;
case LV_EVENT_SHORT_CLICKED: /* 对象被短点击 */
printf("Short clicked\n");
break;
case LV_EVENT_CLICKED: /* 对象被点击 */
printf("Clicked\n");
break;
}
}
/* 指定一个事件回调函数 */
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn, my_event_cb);
■ 不同的事件类型共用一个事件回调函数
■ 事件回调中使用lv_event_cb()函数区分不同对象的事件
■ LVGL-弹性增长值
注意事项:
- 弹性增长属性仅在父容器使用弹性布局时有效。
- 弹性增长值为0时表示不参与额外空间的分配。
- 当多个子对象具有弹性增长属性时,它们之间的空间分配是按照各自的弹性增长值比例进行的。
lv_obj_t * obj;
obj = lv_obj_create(cont); // 在容器上创建对象
lv_obj_set_size(obj, 40, 40); // 设置对象大小
obj = lv_obj_create(cont); // 再次创建对象
lv_obj_set_flex_grow(obj, 1); // 设置弹性增长值为1
obj = lv_obj_create(cont); // 再次创建对象
lv_obj_set_flex_grow(obj, 2); // 设置弹性增长值为2
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); // 设置容器为行布局
■ LVGL-弹性增长值- 实例一:
lv_obj_t * cont = lv_obj_create(lv_scr_act()); // 基于屏幕创建一个cont容器对象
lv_obj_set_size(cont, 400, 220); // 设置对象大小
lv_obj_center(cont); // 对象显示在屏幕中央
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); // 设置对象弹性布局的排列方式,把子对象排成一行,而不需要包裹
lv_obj_t * obj = NULL;
obj = lv_obj_create(cont);
lv_obj_set_size(obj, 20, 40); // 设置对象大小
obj = lv_obj_create(cont);
lv_obj_set_height(obj, 40); // 设置对象高度
lv_obj_set_flex_grow(obj, 1); // 宽度弹性增长,使用一份的剩余空间
obj = lv_obj_create(cont);
lv_obj_set_height(obj, 40);
lv_obj_set_flex_grow(obj, 2); // 宽度弹性增长,使用2份的剩余空间
obj = lv_obj_create(cont);
lv_obj_set_height(obj, 40);
lv_obj_set_flex_grow(obj, 3); // 宽度弹性增长,使用3份的剩余空间
obj = lv_obj_create(cont);
lv_obj_set_size(obj, 40, 40);
■ LVGL-扩展点击区域
lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t size) // 用户必须要在区域边界内点击对象,这样才能成功触发事件
lv_obj_set_ext_click_area(obj, left, right, top, bottom)
默认情况下,只能在对象的坐标上单击对象,
可以使用 lv_obj_set_ext_click_area(obj, left, right, top, bottom) 扩展该区域。
左侧(left)/右侧(right)/顶部(top)/底部(bottom) 描述了可点击区域应在每个方向上超出默认范围的程度。
前提是要在 lv_conf.h 使能 LV_USE_EXT_CLICK_AREA 启用此功能。可能的值为:
LV_EXT_CLICK_AREA_FULL 将所有 4 个坐标存储为 lv_coord_t
LV_EXT_CLICK_AREA_TINY 仅将水平和垂直坐标(使用 左/右和上/下 的较大值)存储为 uint8_t
LV_EXT_CLICK_AREA_OFF 禁用此功能
■ LVGL-父和子对象的关系
示例一:switch2 在switch1里面。
■ LVGL-图层设到前台(foreground)展示
属性 | 描述 |
---|---|
lv_obj_set_top(obj,true) | 如果 obj 或它的任何子对象被点击,那么 LVGL 将自动将该对象带到前台。 |
lv_obj_move_foreground(obj) | 显式地告诉库将对象带到前台。类似地, |
lv_obj_move_background(obj) | 将对象 obj 移动到背台。 |
lv_obj_set_parent(obj,new_parent) | obj 将在 new_parent 的前面。 |
lv_obj_set_top(obj,true) 。如果 obj 或它的任何子对象被点击,那么 LVGL 将自动将该对象带到前台。它的工作原理类似于PC机上典型的GUI,当点击背景中的窗口时,它会在前台展示。
lv_obj_move_foreground(obj) 显式地告诉库将对象带到前台。类似地,使用
lv_obj_move_background(obj) 将对象 obj 移动到背台。
lv_obj_set_parent(obj,new_parent) 时, obj 将在 new_parent 的前面。
■ foreground循环更替处理
static lv_style_t style1, style2;
rect1 = lv_obj_create(lv_scr_act());
rect2 = lv_obj_create(lv_scr_act());
rect3 = lv_obj_create(lv_scr_act());
lv_obj_set_size(rect1, LV_PCT(20), LV_PCT(20));
lv_obj_align(rect1, LV_ALIGN_TOP_LEFT, 20, 20);
lv_style_init(&style1);
lv_style_set_bg_color(&style1, lv_palette_lighten(LV_PALETTE_GREY, 1));
lv_obj_add_style(rect2, &style1, LV_STATE_DEFAULT);
lv_obj_set_size(rect2, LV_PCT(20), LV_PCT(20));
lv_obj_align(rect2, LV_ALIGN_TOP_LEFT, 70, 20);
lv_style_init(&style2);
lv_style_set_bg_color(&style2, lv_palette_lighten(LV_PALETTE_GREEN, 1));
lv_obj_add_style(rect3, &style2, LV_STATE_DEFAULT);
lv_obj_set_size(rect3, LV_PCT(20), LV_PCT(20));
lv_obj_align(rect3, LV_ALIGN_TOP_LEFT, 120, 20);
label = lv_label_create(lv_scr_act());
lv_obj_set_size(label, LV_PCT(20), LV_PCT(20));
lv_obj_align(label, LV_ALIGN_TOP_LEFT, 120, 120);
void testLayerLoop(void)
{
static uint32_t loopCnt = 0;
static uint8_t loopFlag = 0;
if (((++loopCnt) % 1000) == 0)
{
switch (loopFlag)
{
case 0:
lv_obj_move_foreground(rect1);
lv_label_set_text(label, "0");
break;
case 1:
lv_obj_move_foreground(rect2);
lv_label_set_text(label, "1");
break;
case 2:
lv_obj_move_foreground(rect3);
lv_label_set_text(label, "2");
break;
case 3:
lv_obj_move_background(rect3);
lv_label_set_text(label, "3");
break;
case 4:
lv_obj_move_background(rect2);
lv_label_set_text(label, "4");
break;
case 5:
lv_obj_move_background(rect1);
lv_label_set_text(label, "5");
loopFlag = (uint8_t)-1;
break;
}
loopFlag++;
}
}
■ LVGL-清除滚动条
LV_SCROLLBAR_MODE_OFF 表示关闭滚动条。
LV_SCROLLBAR_MODE_ON 表示始终显示滚动条。
LV_SCROLLBAR_MODE_AUTO 表示自动显示滚动条(当内容超出容器时显示)。
LV_SCROLLBAR_MODE_DRAG 表示拖动内容时显示滚动条。
// 清除垂直滚动条
lv_obj_set_scrollbar_mode(obj, LV_SCROLLBAR_MODE_OFF);
// 清除水平滚动条
lv_obj_set_scrollbar_mode(obj, LV_SCROLLBAR_MODE_OFF);
// 如果你同时想清除垂直和水平滚动条,可以这样做:
lv_obj_set_scrollbar_mode(obj, LV_SCROLLBAR_MODE_OFF);
■ LVGL-基础对象API 函数
| 属性 | 描述 |
函数 | 描述 |
---|---|
lv_obj_create () | 创建基础对象(矩形) |
lv_obj_set_user_data() | 设置对象的 user_data 字段 |
lv_obj_has_flag() | 检查是否在对象上设置了指定的标志 |
lv_obj_has_flag_any() | 检查是否在对象上设置了任何标志 |
lv_obj_get_state() | 获取对象的状态 |
lv_obj_has_state() | 检查对象是否处于指定状态 |
lv_obj_get_group() | 获取对象的组 |
lv_obj_get_user_data() | 获取对象的用户数据 |
lv_obj_allocate_spec_attr() | 为对象分配特殊数据(还未分配时) |
lv_obj_check_type() | 检查 obj 的类型 |
lv_obj_has_class() | 检查是否有任何对象具有指定的类 |
lv_obj_get_class() | 获取对象的类 |
lv_obj_is_valid() | 检查是否有任何对象在活动 |
lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t size) | 用户必须要在区域边界内点击对象,这样才能成功触发事件 |