LVGL V8学习之键盘按键样式重绘(一)

这一篇研究一下基于btnmatrix的键盘按键重绘,还是通过codeblock来模拟代码的运行,代码如下:

static const char * kb_map[] =
{
	"1","2", "3","\n",
	"4", "5", "6", "\n",
	"7", "8", "9" ,"\n",
	".","0",LV_SYMBOL_BACKSPACE,""
};


static void textarea_event_callback(lv_event_t * event)
{
    if (event == NULL)
	{
		printf("[%s:%d] event is NULL\n", __FUNCTION__, __LINE__);
		return ;
	}

	lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * text_area_obj = lv_event_get_target(event);

    if ((code == LV_EVENT_CLICKED) && (text_area_obj != NULL))
    {

    }
}


static void btnmatrix_event_cb(lv_event_t * event)
{
    if (event == NULL)
	{
		printf("[%s:%d] event is NULL\n", __FUNCTION__, __LINE__);
		return ;
	}

    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t * obj = lv_event_get_target(event);

    if (LV_EVENT_VALUE_CHANGED == code)
    {
        if (obj != NULL)
        {
            lv_obj_t * text_area_obj = (lv_obj_t *)lv_event_get_user_data(event);
            uint16_t id = lv_btnmatrix_get_selected_btn(obj);
            const char * txt = lv_btnmatrix_get_btn_text(obj, id);

            if (text_area_obj != NULL)
            {
                if (strcmp(txt, LV_SYMBOL_BACKSPACE) == 0)
                {
                    lv_textarea_del_char(text_area_obj);
                }
                else
                {
                    lv_textarea_add_text(text_area_obj, txt);
                }
            }
        }
    }
    else if (code == LV_EVENT_DRAW_PART_BEGIN)
    {
        lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(event);

        /*Change the draw descriptor the 1st button*/
        if (dsc->id == 0)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 1)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        /*Change the draw descriptor the 3rd button*/
        else if (dsc->id == 2)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 3)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 4)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 5)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 6)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 7)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 8)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 9)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 10)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
        else if (dsc->id == 11)
        {
            dsc->rect_dsc->radius = 5; //LV_RADIUS_CIRCLE;
            if(lv_btnmatrix_get_selected_btn(obj) == dsc->id)
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF954D);//lv_palette_darken(LV_PALETTE_RED, 3);
            }
            else
            {
                dsc->rect_dsc->bg_color = lv_color_hex(0xFF6008);//lv_palette_main(LV_PALETTE_RED);
            }

            dsc->label_dsc->color = lv_color_white();
        }
    }
}


/**
 * Add custom drawer to the button matrix to customize butons one by one
 */
void lv_btnmatrix_draw_test(void)
{
     // 当前页面的画布容器
    lv_obj_t *main_container = lv_obj_create(lv_scr_act()); // 基于屏幕创建了一个容器
	if (main_container == NULL)
	{
		printf("[%s:%d] create main_container failed\n", __FUNCTION__, __LINE__);
		return;
	}

	// 画布样式
	static lv_style_t main_cont_style;
    lv_style_reset(&main_cont_style);
	lv_style_init(&main_cont_style); // 初始化样式
    lv_style_set_radius(&main_cont_style, 0); // 设置样式的圆角弧度
	lv_style_set_border_width(&main_cont_style, 0); // 设置边框宽度
	lv_style_set_bg_opa(&main_cont_style, LV_OPA_50); // 设置样式背景的透明度
    lv_style_set_bg_color(&main_cont_style, lv_color_hex(0xFFFFFF));
    lv_style_set_pad_all(&main_cont_style, 0); // 设置样式内部填充
    lv_obj_add_style(main_container, &main_cont_style, 0);  // 给对象添加样式
	lv_obj_set_size(main_container, LV_PCT(100), LV_PCT(100)); //设置大小
    lv_obj_center(main_container); // 对象居屏幕中间显示

    lv_obj_t * textarea = lv_textarea_create(main_container);
	if (textarea == NULL)
	{
	    printf("[%s:%d] obj textarea create failed\n", __FUNCTION__, __LINE__);
		return;
	}

	static lv_style_t text_area_style;
	lv_style_reset(&text_area_style); // 重置样式
	lv_style_init(&text_area_style); // 初始化样式
	lv_style_set_border_width(&text_area_style, 1); // 设置边框宽度
	lv_style_set_radius(&text_area_style, 0); // 设置样式的圆角弧度
    lv_style_set_pad_all(&text_area_style, 8); // 设置样式底部padding填充宽度
	lv_style_set_text_font(&text_area_style, &lv_font_montserrat_20); //设置字体
    lv_obj_add_style(textarea, &text_area_style, 0);  // 给对象添加样式

    lv_textarea_set_max_length(textarea, 6); // 设置最大输入长度
    lv_textarea_set_one_line(textarea, true); // 只显示一行
    lv_textarea_set_password_mode(textarea, false); // 关闭密码模式
    lv_obj_set_size(textarea, 255, 40); // 设置对象大小
    lv_obj_align(textarea, LV_ALIGN_TOP_MID, 0, 50); // 设置对齐
    //lv_obj_add_event_cb(textarea, textarea_event_callback, LV_EVENT_CLICKED, NULL);


    // 基于屏幕创建了一个容器
    lv_obj_t *keyboard_bg_cont = lv_obj_create(main_container);
	if (keyboard_bg_cont == NULL)
	{
		printf("[%s:%d] create keyboard_bg_cont failed\n", __FUNCTION__, __LINE__);
		return;
	}

	static lv_style_t bg_style;
    lv_style_reset(&bg_style); // 重置样式
	lv_style_init(&bg_style); // 初始化样式
	lv_style_set_border_width(&bg_style, 0); // 设置边框宽度
	lv_style_set_radius(&bg_style, 5); // 设置样式的圆角弧度
    lv_style_set_pad_all(&bg_style, 0); // 设置样式底部padding填充宽度
    lv_style_set_bg_opa(&bg_style, LV_OPA_50); // 设置样式背景的透明度
    lv_style_set_bg_color(&bg_style, lv_color_hex(0x000000));

    lv_obj_add_style(keyboard_bg_cont, &bg_style, 0);  // 给对象添加样式
    lv_obj_set_size(keyboard_bg_cont, 260, 245); //设置对象大小
    lv_obj_center(keyboard_bg_cont); // 居中显示

    // 基于背景容器创建按键矩阵
    lv_obj_t * btnmatrix = lv_btnmatrix_create(keyboard_bg_cont);
    if (btnmatrix == NULL)
    {
        printf("[%s:%d] create btnmatrix obj failed\n", __FUNCTION__, __LINE__);
        return ;
    }

    lv_obj_clear_flag(btnmatrix, LV_OBJ_FLAG_CLICK_FOCUSABLE);
    lv_btnmatrix_set_map(btnmatrix, kb_map);

    // 给键盘矩阵添加样式
	static lv_style_t button_matrix_style;
	lv_style_reset(&button_matrix_style); // 重置样式
	lv_style_init(&button_matrix_style); // 初始化样式
	lv_style_set_border_width(&button_matrix_style, 0); // 设置边框宽度
	lv_style_set_radius(&button_matrix_style, 5); // 设置样式的圆角弧度
    lv_style_set_pad_all(&button_matrix_style, 0); // 设置样式底部padding填充宽度
	lv_style_set_text_opa(&button_matrix_style, LV_OPA_COVER);
	lv_style_set_text_font(&button_matrix_style, &lv_font_montserrat_20); //设置字体

    lv_obj_add_style(btnmatrix, &button_matrix_style, 0);  // 给对象添加样式
    //lv_obj_add_event_cb(btnmatrix, btnmatrix_event_cb, LV_EVENT_ALL, NULL);
    lv_obj_add_event_cb(btnmatrix, btnmatrix_event_cb, LV_EVENT_ALL, (void *)(textarea));
    lv_obj_set_size(btnmatrix, 260, 245);
    lv_obj_center(btnmatrix);
}

运行效果:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用LVGL库来实现鼠标输入设备的支持。LVGL提供了一个继承自输入设备接口的鼠标输入设备驱动程序。你可以在LVGL的文档中找到关于鼠标输入设备的详细信息和示例代码。以下是一个简单的示例,展示了如何使用LVGL来处理鼠标输入: ```c #include "lvgl/lvgl.h" // 鼠标输入设备事件回调函数 bool mouse_event_cb(lv_indev_drv_t * drv, lv_event_t event) { if (event == LV_EVENT_PRESSED) { // 处理鼠标按下事件 } else if (event == LV_EVENT_RELEASED) { // 处理鼠标释放事件 } else if (event == LV_EVENT_SHORT_CLICKED) { // 处理鼠标短按事件 } else if (event == LV_EVENT_LONG_PRESSED) { // 处理鼠标长按事件 } // 返回true表示事件已经处理,返回false表示事件未处理 return true; } int main() { // 初始化LVGL库 lv_init(); // 初始化显示设备、鼠标输入设备等 lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); // 设置显示设备相关参数... lv_indev_drv_t indev_drv; lv_indev_drv_init(&indev_drv); // 设置鼠标输入设备相关参数... indev_drv.read_cb = mouse_event_cb; // 注册鼠标输入设备 lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv); // 创建一个窗口 lv_obj_t * win = lv_win_create(lv_scr_act()); // 设置窗口相关参数... // 设置窗口的输入设备为鼠标输入设备 lv_win_set_click(win, mouse_indev); while (1) { // 处理LVGL库的任务 lv_task_handler(); } } ``` 该示例演示了如何初始化LVGL库、注册鼠标输入设备并将其与窗口关联。你可以根据自己的需要在回调函数中处理鼠标事件。请注意,上述示例只是基本的框架,你需要根据实际情况进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值