如何利用物理按键控制LVGL控件的大小与状态

发布于:2025-03-17 ⋅ 阅读:(12) ⋅ 点赞:(0)

​ lvgl可以利用物理按键控制控件的选择和状态,演示视频如下:

单物理按键控制LVGL控件的选择和状态

移植方法如下:
  • 1 在注册设备中,填写对应的变量和初始化函数。这里我们以移keypad为例,因为keypad的功能很多。
    ![请添加图片描述](https://i-blog.csdnimg.cn/direct/dee41d9aad8c42c69e955bc0ce943238.png
/* keypad */
static void keypad_init(void);
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static uint32_t keypad_get_key(void);

lv_indev_t * indev_keypad;
  • 2 在lv_port_indev_init(void)函数中填写对应初始化内容
    在这里插入图片描述
		/*Initialize your keypad or keyboard if you have*/
    keypad_init();

    /*Register a keypad input device*/
    lv_indev_drv_init(&indev_drv1);
    indev_drv1.type = LV_INDEV_TYPE_KEYPAD;
    indev_drv1.read_cb = keypad_read;
    indev_keypad = lv_indev_drv_register(&indev_drv1);

    /*Later you should create group(s) with `lv_group_t * group = lv_group_create()`,
     *add objects to the group with `lv_group_add_obj(group, obj)`
     *and assign this input device to group to navigate in it:
     *`lv_indev_set_group(indev_keypad, group);`*/
  • 3 在这个三个函数里面填入你的设备内容
    • 1 static void keypad_init(void) //你按键初始化内容
    • 2 static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)//返回值控制控件的方式
    • static uint32_t keypad_get_key(void)//获取到按键对应值的函数
/*------------------
 * Keypad
 * -----------------*/

/*Initialize your keypad*/
static void keypad_init(void)
{
    /*Your code comes here*/
	key_gpio_config();
}

/*Will be called by the library to read the mouse*/
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static uint32_t last_key = 0;

    /*Get the current x and y coordinates*/
//    mouse_get_xy(&data->point.x, &data->point.y);

    /*Get whether the a key is pressed and save the pressed key*/
    uint32_t act_key = keypad_get_key();
    if(act_key != 0) {
        data->state = LV_INDEV_STATE_PR;

        /*Translate the keys to LVGL control characters according to your key definitions*/
        switch(act_key) {
            case 1:
                act_key = LV_KEY_NEXT;
                break;
            case 2:
                act_key = LV_KEY_PREV;
                break;
            case 3:
                act_key = LV_KEY_LEFT;
                break;
            case 4:
                act_key = LV_KEY_RIGHT;
                break;
            case 5:
                act_key = LV_KEY_ENTER;
                break;
        }

        last_key = act_key;
    }
    else {
        data->state = LV_INDEV_STATE_REL;
    }

    data->key = last_key;
}

/*Get the currently being pressed key.  0 if no key is pressed*/
static uint32_t keypad_get_key(void)
{
    /*Your code comes here*/
    return key_scan();
}			
  • 4 创建一个组group,并将你想控制ui控件添加组,并将其与你的输入设备keypad关联起来,这样就可以控制了。
void setup_gui()
{
	lv_group_t * group = lv_group_create();//创建一个组
    // 创建屏幕对象
    lv_obj_t * scr = lv_disp_get_scr_act(NULL);
    /* 创建一个开关控件 */
    lv_obj_t * switch_obj = lv_switch_create(scr);
    lv_obj_set_pos(switch_obj, 50, 50);  // 设置位置
    lv_obj_set_size(switch_obj, 100, 40);  // 设置大小
    lv_obj_set_style_bg_color(switch_obj, lv_color_hex(0xffffff), LV_PART_INDICATOR);

    lv_obj_t * switch_obj1 = lv_switch_create(scr);
    lv_obj_set_pos(switch_obj1, 200, 50);  // 设置位置
    lv_obj_set_size(switch_obj1, 100, 40);  // 设置大小
    lv_obj_set_style_bg_color(switch_obj1, lv_color_hex(0xffffff), LV_PART_INDICATOR);

    lv_obj_t * switch_obj2 = lv_switch_create(scr);
    lv_obj_set_pos(switch_obj2, 350, 50);  // 设置位置
    lv_obj_set_size(switch_obj2, 100, 40);  // 设置大小
    lv_obj_set_style_bg_color(switch_obj2, lv_color_hex(0xffffff), LV_PART_INDICATOR);

    lv_obj_t * label;
    lv_obj_t * btn1 = lv_btn_create(scr);
    lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);
    lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);

    label = lv_label_create(btn1);
    lv_label_set_text(label, "Button");
    lv_obj_center(label);

    lv_obj_t * btn2 = lv_btn_create(scr);
    lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);
    lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);
    lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
    lv_obj_set_height(btn2, LV_SIZE_CONTENT);

    label = lv_label_create(btn2);
    lv_label_set_text(label, "Toggle");
    lv_obj_center(label);
		
    /*Create a slider in the center of the display*/
    lv_obj_t * slider = lv_slider_create(scr);
    lv_obj_align(slider, LV_ALIGN_CENTER, 0, 80);
    lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

    /*Create a label below the slider*/
    slider_label = lv_label_create(scr);
    lv_label_set_text(slider_label, "0%");

    lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
		
    /* 将ui控件添加到组里面去 */
    lv_group_add_obj(group, switch_obj);
    lv_group_add_obj(group, switch_obj1);
    lv_group_add_obj(group, switch_obj2);
    lv_group_add_obj(group, btn1);
    lv_group_add_obj(group, btn2);
    lv_group_add_obj(group, slider);
    /* 将输入设备keypad关联起来 */
    lv_indev_set_group(indev_keypad, group);
}

网站公告

今日签到

点亮在社区的每一天
去签到