LVGL lv_btnmatrix矩阵按键(18)

lv_btnmatrix

lv_btnmatrix不是真正的lv_btn按钮对象,但是有和lv_btn一样的点击效果,绘出相同按钮下比lv_btn占用内存小。
lv_btnmatrix可以设置每个按钮文本标题、相对大小、属性

属性类型

/** Type to store button control bits (disabled, hidden etc.)
 * The first 3 bits are used to store the width */
enum {
    LV_BTNMATRIX_CTRL_HIDDEN     = 0x0008, /**< 设置按钮为隐藏不可见状态 */
    LV_BTNMATRIX_CTRL_NO_REPEAT  = 0x0010, /**< 设置按钮不具有重复长按的动作效果 */
    LV_BTNMATRIX_CTRL_DISABLED   = 0x0020, /**< 设置按钮为禁用状态 */
    LV_BTNMATRIX_CTRL_CHECKABLE  = 0x0040, /**< 设置按钮为 Toggle 切换按钮 */
    LV_BTNMATRIX_CTRL_CHECK_STATE  = 0x0080, /**< 设置按钮当前的状态就是切换态 */
    LV_BTNMATRIX_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_SELECTED on CLICK, 0: Send LV_EVENT_SELECTED on PRESS 设置按钮的点击方式为松手触发,如果不设置的话,那默认
就是按下时触发,二者只能选择一种*/
};
typedef uint16_t lv_btnmatrix_ctrl_t;

样式

enum {
    LV_BTNMATRIX_PART_BG,
    LV_BTNMATRIX_PART_BTN,
};
typedef uint8_t lv_btnmatrix_part_t;

例子

lv_obj_t * btnm1;
static const char * btnm1_map[] = { "    "LV_SYMBOL_AUDIO"\n#ff0000 AUDIO#", "    "LV_SYMBOL_VIDEO"\n#ff0000 VIDEO#", "\n",//换行
								   "    "LV_SYMBOL_HOME"\n#ff0000 HOME#",   "    "LV_SYMBOL_SAVE"\n#ff0000 SAVE#",
								   "" };//空字符串作为结束符
static const char * btnm2_map[] = { "Btn1","Btn2","Btn3","" };
static void event_handler(lv_obj_t * obj, lv_event_t event)
{
	const char * txt;
	uint16_t btn_id;
    if(event == LV_EVENT_VALUE_CHANGED) {
		//获得当前被点击按钮标题
        txt = lv_btnmatrix_get_active_btn_text(obj);
		//获得当前被点击按钮id
		btn_id = *((uint16_t*)lv_event_get_data());//方式1
		//btn_id = lv_btnmatrix_get_active_btn(obj); //方式2
        printf("text:%s was pressed id:%d \n", txt, btn_id);

		if (strcmp(txt, btnm2_map[0]) == 0)//切换btnm1中id0的禁用控制属性
		{
			if (lv_btnmatrix_get_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_DISABLED))
				lv_btnmatrix_clear_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_DISABLED);
			else
				lv_btnmatrix_set_btn_ctrl(btnm1, 0, LV_BTNMATRIX_CTRL_DISABLED);
		}
		if (strcmp(txt, btnm2_map[1]) == 0)//切换btnm1中id0的禁用控制属性
		{
			if (lv_btnmatrix_get_btn_ctrl(btnm1, 1, LV_BTNMATRIX_CTRL_HIDDEN))
				lv_btnmatrix_clear_btn_ctrl(btnm1, 1, LV_BTNMATRIX_CTRL_HIDDEN);
			else
				lv_btnmatrix_set_btn_ctrl(btnm1, 1, LV_BTNMATRIX_CTRL_HIDDEN);
		}
    }
}
void lv_ex_btnmatrix_1(void)
{
	static lv_style_t style_btnm1_bg;
	lv_style_init(&style_btnm1_bg);
    /*用这些间距和btnm1对象size间接控制按键大小*/
	lv_style_set_pad_top(&style_btnm1_bg, LV_STATE_DEFAULT,5);
	lv_style_set_pad_bottom(&style_btnm1_bg, LV_STATE_DEFAULT, 5);
	lv_style_set_pad_left(&style_btnm1_bg, LV_STATE_DEFAULT, 15);
	lv_style_set_pad_right(&style_btnm1_bg, LV_STATE_DEFAULT, 15);
	lv_style_set_pad_inner(&style_btnm1_bg, LV_STATE_DEFAULT, 5);
	//lv_style_set_bg_color(&style_btnm1_bg, LV_STATE_DEFAULT, LV_COLOR_PURPLE);

	static lv_style_t style_btnm1;
	lv_style_init(&style_btnm1);
	lv_style_set_radius(&style_btnm1, LV_STATE_DEFAULT, 5);
	lv_style_set_bg_color(&style_btnm1, LV_STATE_DEFAULT, LV_COLOR_SILVER);

	btnm1 = lv_btnmatrix_create(lv_scr_act(), NULL);
	lv_obj_set_size(btnm1,150,150);
	lv_obj_align(btnm1, NULL, LV_ALIGN_CENTER, 0, 0);
    lv_btnmatrix_set_map(btnm1, btnm1_map);//设置映射表
	lv_btnmatrix_set_recolor(btnm1, true);//使能重绘色	
	lv_obj_add_style(btnm1, LV_BTNMATRIX_PART_BG, &style_btnm1_bg);
	lv_obj_add_style(btnm1, LV_BTNMATRIX_PART_BTN, &style_btnm1);
	lv_obj_set_event_cb(btnm1, event_handler);

	//创建btnm2,演示 One Toggle 特性
	lv_obj_t * btnm2 = lv_btnmatrix_create(lv_scr_act(), NULL);
	lv_obj_set_size(btnm2, 220, 50);
	lv_obj_align(btnm2, btnm1, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
	lv_btnmatrix_set_map(btnm2, btnm2_map);
	lv_btnmatrix_set_btn_width(btnm2, 1, 2);//设置Btn2按钮(id=1)的宽度是其他按钮的2倍
	lv_btnmatrix_set_btn_ctrl_all(btnm2, LV_BTNMATRIX_CTRL_CHECKABLE);//所有按钮使能toggled
    //lv_btnmatrix_set_btn_ctrl(btnm2, 0, LV_BTNMATRIX_CTRL_CHECKABLE);//单个设置
    lv_btnmatrix_set_btn_ctrl(btnm2, 2, LV_BTNMATRIX_CTRL_CHECK_STATE);//Btn3默认处于toggled状态
	lv_obj_set_event_cb(btnm2, event_handler);
}

在这里插入图片描述

要在LVGL中使用btnmatrix矩阵按键,您可以按照以下步骤进行: 1. 使用Arduino IDE和LVGL库创建一个新的项目。 2. 在项目中创建一个新的屏幕页面,用于显示矩阵按键。 3. 创建btnmatrix对象,并设置其行列数以及按键的名称和事件。 4. 将btnmatrix对象添加到屏幕页面上。 5. 实现与矩阵按键的交互,例如在按下按键时触发相应的事件。 以下是示例代码,显示如何创建btnmatrix矩阵按键并将其添加到屏幕页面: ```c #include <lvgl.h> // 定义矩阵键盘的行和列数 #define MATRIX_ROWS 4 #define MATRIX_COLS 4 // 定义矩阵键盘的布局 static const char *btnm_map[] = {"1", "2", "3", "A", "4", "5", "6", "B", "7", "8", "9", "C", "*", "0", "#", "D", ""}; // 创建btnmatrix对象 lv_obj_t *btnmatrix; // 按键事件回调函数 void btnmatrix_event_cb(lv_obj_t *btnm, lv_event_t event) { if (event == LV_EVENT_VALUE_CHANGED) { const char *txt = lv_btnmatrix_get_active_btn_text(btnm); // 处理按键事件 } } // 创建屏幕页面并添加btnmatrix矩阵按键 void create_screen() { lv_obj_t *screen = lv_obj_create(NULL, NULL); lv_scr_load(screen); btnmatrix = lv_btnmatrix_create(screen, NULL); lv_btnmatrix_set_map(btnmatrix, btnm_map); lv_btnmatrix_set_btn_width(btnmatrix, lv_obj_get_width(screen) / MATRIX_COLS); lv_btnmatrix_set_btn_height(btnmatrix, lv_obj_get_height(screen) / MATRIX_ROWS); lv_obj_set_event_cb(btnmatrix, btnmatrix_event_cb); } void setup() { // 初始化LVGLlv_init(); // 创建屏幕页面并添加btnmatrix矩阵按键 create_screen(); } void loop() { // 处理LVGL库中的事件 lv_task_handler(); } ``` 请注意,以上代码仅用于演示目的,需要根据您的具体需求进行修改和调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值