lvgl的所有空间widget都基于lv_obj_t。t表示类型,自定义类型。

lv_btn_create()
lv_lable_create()
//都(继承)lv_obj_t
//lv_obj_t是一个结构体,其实lv_btn_create() lv_lable_create()都是用于创建lv_obj_t结构体
//类似面向对象语言中的子类型转成父类型

widget创建:

lv_obj_t *w1 = lv_obj_create(lv_scr_act());
//这里的lv_scr_act()表示整块屏幕的根父类。
lv_obj_t *w2 = lv_obj_create(w1);
//这里的w2的父类是w1。

//	w2会随w1的位置移动而相对移动。

widget属性:

lv_obj_t *w1 = lv_obj_create(lv_scr_act());
  1. 大小

    //设置宽度为100
    lv_obj_set_width(w1,100);
    //设置高度为50
    lv_obj_set_height(w1,50);
    //同时设置宽度和高度 100x50
    lv_obj_set_size(w1,100,50);
    
    //如果部件没有设置,会有默认的宽高。
    
  2. 位置

    //坐标系跟电脑屏幕的是一样的,左上角为0,0 右下角为x,y。
    //部件默认是在父类对象的左上角
    //设置的是相对位置,不是绝对位置
    
    //设置x轴坐标
    lv_obj_set_x(w1,100);
    //设置y轴坐标
    lv_obj_set_y(w1,100);
    //同时设置x,y轴坐标
    lv_obj_set_pos(w1,100,100);//posation
    
  3. 对齐*

    //1.参照父对象对齐
    lv_obj_set_align(obj,LV_ALIGN_...);
    //参照父对象对齐,在进行偏移
    lv_obj_align(obj,LV_ALIGN_...,x,y);
    
    //2.参照其他对象对齐(无父子关系之间的对象)
    //参照其他对象对齐,再进行偏移
    lv_obj_align_to(obj_to_align,obj_referece,LV_ALIGN_...,x,y)
    
  4. 样式

    static lv_style_t style; //这里如果没有设置static 或者lv_style_t没有全局,会随方法栈丢失
    lv_style_init(&style);//必须先初始化
    //设置边框
    lv_style_set_border_color(&style, lv_color_hex(0x00FF00));
    
    //创建对象
    lv_obj_t *obj = lv_obj_create(lv_scr_act());
    //应用到对象
    lv_obj_add_style(obj, &style, LV_STATE_PRESSED);
    

    上面是最常用的方式,这种方式可以将样式和代码进行分离。单独一个文件存放样式。

    //直接设置
    lv_obj_t *obj2 = lv_obj_create(lv_scr_act());
    lv_obj_set_style_bg_color(obj2, lv_color_hex(0xFF0000),LV_STATE_DEFAULT);
    lv_obj_set_style_bg_opa(obj2, LV_OPA_50,LV_STATE_DEFAULT);
    lv_obj_set_style_bg_color(obj2, lv_color_hex(0x00FF00),LV_STATE_PRESSED);
    

    这种方式也有一定的应用。

不同部件的样式
lv_obj_t *slider = lv_slider_create(lv_scr_act());
lv_obj_align(slider, LV_ALIGN_BOTTOM_MID,0,-40);
//设置slider主体颜色
lv_obj_set_style_bg_color(slider, lv_color_hex(0xFF0000),LV_STATE_DEFAULT|LV_PART_INDICATOR);
lv_obj_set_style_bg_color(slider, lv_color_hex(0xFF0000),LV_STATE_DEFAULT|LV_PART_MAIN);
lv_obj_set_style_bg_color(slider, lv_color_hex(0xFF0000),LV_STATE_DEFAULT|LV_PART_KNOB);

5.事件

lv_obj_t *btn = lv_btn_create(lv_scr_act());
static char* my_data = "Hello World";
//不能这么写 LV_EVENT_CLICKED | LV_EVENT_LONG_PRESSED只会触发一个
lv_obj_add_event_cb(btn, lv_event_handler, LV_EVENT_CLICKED, my_data);
//这里的my_data可以传任意类型的指针
lv_obj_add_event_cb(btn, lv_event_handler, LV_EVENT_LONG_PRESSED, my_data);
static void lv_event_handler(lv_event_t *e)
{
  void *user_data = lv_event_get_user_data(e);
  // 根据实际类型进行转换和使用
  char *str = (char*)user_data;
  //判断事件类型
  lv_event_code_t code = lv_event_get_code(e);
  if(code == LV_EVENT_CLICKED)
  {
    //修改寄存器值
    printf("event_code: %d,%s\n",e->code,str);
  }else if( code == LV_EVENT_LONG_PRESSED) {
    //修改寄存器值
    printf("event_code: %d,%s\n",e->code,str);
  }
  //判断是否是父级对象
}