当前位置: 首页 > news >正文

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

​ 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);
}

相关文章:

  • 基于自定义线程池手写一个异步任务管理器
  • 2025 linux系统资源使用率统计docker容器使用率统计docker监控软件Weave Scope安装weavescope
  • 快速导出MySQL数据表结构到Excel或Word的方法(Navicat和EasyDatabaseExport)
  • 十种宠物狗-图像分类数据集
  • 分享一个免费的CKA认证学习资料
  • 【eNSP实战】配置Easy IP
  • ClickHouse总体学习
  • uniapp报毒
  • 明基PD2700U显示器无法调节图像模式
  • 骨质健康护理笔记
  • bhSDR Matlab-通用软件无线电平台
  • VSTO(C#)Excel开发8:打包发布安装卸载
  • 设计模式之命令设计模式
  • 墨香阁-测试报告
  • 星越L_电动车窗使用及初始化讲解
  • Ai智能体四:互动式 AI 聊天助手:前端实现
  • 【PHP】新版本特性记录(持续更新)
  • el-table表格样式设置单元格样式方法 :cell-class-name
  • Vue3 Pinia $subscribe localStorage的用法 Store的组合式写法
  • Postman中Authorization和Headers的区别
  • 哈马斯官员:若实现永久停火,可交出加沙地带控制权
  • 六连板成飞集成:航空零部件业务收入占比为1.74%,市场环境没有重大调整
  • 上海国际电影节纪录片单元,还世界真实色彩
  • 从《让·桑特伊》到《追忆》,假故事的胜利
  • 上海团队在医学顶刊连发两文,率先提出“证据污染”循证概念
  • 珠峰窗口期5月开启 普通人登一次有多烧钱?