部件创造API函数:

lv_obj_t* obj1 = lv_btn_create(lv_scr_act());

部件大小(size)设置相关API函数:

  1. 设置宽度:lv_obj_set_width(obj, new_width);

  2. 设置高度:lv_obj_set_height(obj, new_height);

  3. 同时设置宽度、高度:lv_obj_set_size(obj, new_width, new_height);

部件位置(position)设置相关API函数:

  1. 设置X轴坐标:lv_obj_set_x(obj, new_x);

  2. 设置Y轴坐标:lv_obj_set_y(obj, new_y);

  3. 同时设置X、Y轴坐标:lv_obj_set_pos(obj, new_x, new_y);

部件对齐(alignment)API函数及其使用:

(使用时一定要考虑范围,可能对齐之后对象超出了屏幕或者父对象范围)

image
"子对象" 只能使用灰色框内部的对齐方式;

"父对象" 才能使用灰色框外部的对齐方式;

"相互独立的对象" 能使用所有的对齐方式;

        如果子对象使用了父对象才能使用的对齐方式,如OUT_LEFT_MID,那也只会在LEFT_MID的位置上。

相当于先做一个判断,如果是子对象调用函数,在进行判断是灰色框内外的函数,如果是内,则正常使用,如果是外,则转换成内的对齐方式;

if(子对象调用)
{
    if(灰色框内)
        正常调用;
    else
        强行调用灰色框内;
}

1.参照父对象对齐

  1. 参照父对象对齐:lv_obj_set_align(obj, LV_ALIGN_...);

    obj:父对象;

    LV_ALIGN_...:前面的(LV_ALIGN_)是对齐方式前缀,后面的(...)是具体的对齐方式,比如CENTER、TOP_MID,如上图对齐模式所示
  2. 参照父对象对齐,再进行偏移: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. 如何给部件添加样式?

  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);/* 设置部件的样式 */
    
    
  2. 添加本地(局部)样式:
    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. 有哪些样式属性可以设置?

  1. 大小(size);
  2. 位置(position);
  3. 背景(Background);
  4. 轮廓(Outline);
  5. 边框(Border);
  6. 阴影(Shadow);
  7. 其它(Others);

    具体的样式属性及其使用方法,如边框宽度、颜色...可以去百问网LVGL文档或者官方LVGL文档进行查看

    查找方法:1. 可以通过lv_style_set_bg_color()函数然后跳转到定义;

                      2.如果比较熟悉的话可以通过lv_style_set_...()的方式直接打出前缀,根据代码补全或自己打的方式补全;

4. 如何单独设置部件中某个部分的样式?

image

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) 来知道本次触发的事件是什么类型的,如是长按触发的还是单击触发;同样可以通过这个函数知道导致触发的是哪个对象,如是父对象还是子对象。