lvgl可以利用物理按键控制控件的选择和状态,演示视频如下:
单物理按键控制LVGL控件的选择和状态
移植方法如下:
- 1 在注册设备中,填写对应的变量和初始化函数。这里我们以移keypad为例,因为keypad的功能很多。
;
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);
}