LVGL V8自定义实现radio button

18 篇文章 1 订阅

这几天由于开发任务的需要,需要自定义实现一个radio button的功能,所以通过研究button添加LV_OBJ_FLAG_CHECKABLE属性实现了一个简单的radio button,下面直接上代码

#include <string.h>
#include <stdlib.h>
#include "lvgl/lvgl.h"


#define THIS_FILE  "inpatient_cost.c"


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

    uint32_t* active_id = (uint32_t*)lv_event_get_user_data(event); //获取用户数据
    lv_obj_t* obj_cont = lv_event_get_current_target(event); // 获取当前目标事件的布局对象
    lv_obj_t* obj_active = lv_event_get_target(event);//获取产生事件的对象
    lv_obj_t* obj_old = lv_obj_get_child(obj_cont, *active_id); //根据id序号获取子对象

    if (obj_active == obj_cont)
    {
        return; //不处理layout布局对象产生的事件
    }

    lv_obj_clear_state(obj_old, LV_STATE_CHECKED); //清除先前的选择状态
    lv_obj_add_state(obj_active, LV_STATE_CHECKED); // 设置点击的对象为选中状态

    // 选中和非选中字体颜色要和背景颜色互换
    lv_obj_t * obj_old_child = lv_obj_get_child(obj_old, 0);
    if (obj_old_child != NULL)
    {
        lv_obj_set_style_text_color(obj_old_child, lv_color_hex(0x1985CE), 0);
    }

    lv_obj_t * obj_active_child = lv_obj_get_child(obj_active, 0);
    if (obj_active_child != NULL)
    {
        lv_obj_set_style_text_color(obj_active_child, lv_color_hex(0xFFFFFF), 0);
    }

    *active_id = lv_obj_get_index(obj_active); //获取选中对象的id序号并保存在active_id所指向的内存中
    printf("[%s::%s:%d] active_id:%u\n", THIS_FILE, __FUNCTION__, __LINE__, (uint32_t)*active_id);
}


static void lv_gui_radio_button_test()
{
    static uint32_t active_index = 0;

    lv_obj_t *parent = lv_scr_act();

    // 整个页面的白色背景
    lv_obj_t * obj_page_bg = lv_obj_create(parent);
    if (obj_page_bg == NULL)
    {
        printf("[%s::%s:%d] obj_page_bg create failed\n", THIS_FILE, __FUNCTION__, __LINE__);
        return ;
    }

    lv_obj_set_style_radius(obj_page_bg, 10, 0); //圆角弧度
    lv_obj_set_style_pad_all(obj_page_bg, 0, 0); //内部padding填充
    lv_obj_set_style_border_width(obj_page_bg, 0, 0); //边框宽度
    lv_obj_set_style_bg_color(obj_page_bg, lv_color_hex(0xFFFFFF), 0); // 背景颜色设置
    lv_obj_set_size(obj_page_bg, 800, 480);
    lv_obj_align(obj_page_bg, LV_ALIGN_TOP_LEFT, 0, 0);

    // 表头按键容器
    lv_obj_t* obj_btn_cont = lv_obj_create(obj_page_bg);
    if (obj_btn_cont == NULL)
    {
        printf("[%s::%s:%d] obj_btn_cont create failed\n", THIS_FILE, __FUNCTION__, __LINE__);
        return ;
    }

    lv_obj_set_style_radius(obj_btn_cont, 0, 0); //圆角弧度
    lv_obj_set_style_pad_all(obj_btn_cont, 0, 0); //内部padding填充
    //lv_obj_set_flex_flow(obj_btn_cont, LV_FLEX_FLOW_ROW);//设置布局为
    lv_obj_set_size(obj_btn_cont, 288, 36); //设置大小
    lv_obj_align(obj_btn_cont, LV_ALIGN_TOP_LEFT, 150, 10);
    lv_obj_add_event_cb(obj_btn_cont, radio_btn_event_callback, LV_EVENT_CLICKED, &active_index);

    // 每日费用明细按键
    lv_obj_t* btn_daily_cost = lv_btn_create(obj_btn_cont);  //在parent对象上创建checkbox对象
    if (btn_daily_cost == NULL)
    {
        printf("[%s::%s:%d] btn_daily_cost create failed\n", THIS_FILE, __FUNCTION__, __LINE__);
        return ;
    }

    lv_obj_add_flag(btn_daily_cost, LV_OBJ_FLAG_CHECKABLE); // 添加可选中属性
    lv_obj_add_flag(btn_daily_cost, LV_OBJ_FLAG_EVENT_BUBBLE); // 添加事件传导
    lv_obj_set_style_pad_all(btn_daily_cost, 0, 0); //内部padding填充
    lv_obj_set_style_radius(btn_daily_cost, 0, 0); //圆角弧度
    lv_obj_set_style_bg_opa(btn_daily_cost, LV_OPA_COVER, 0);
    lv_obj_set_style_bg_color(btn_daily_cost, lv_color_hex(0xFFFFFF), 0);
    lv_obj_set_style_bg_color(btn_daily_cost, lv_color_hex(0x0D5EBF), LV_STATE_CHECKED); // 选中时的背景颜色
    lv_obj_set_size(btn_daily_cost, 140, 32); //设置大小
    lv_obj_align(btn_daily_cost, LV_ALIGN_TOP_LEFT, 0, 0);

    lv_obj_t * btn_daily_cost_label = lv_label_create(btn_daily_cost);
    if (btn_daily_cost_label == NULL)
    {
        printf("[%s::%s:%d] btn_daily_cost_label create failed\n", THIS_FILE, __FUNCTION__, __LINE__);
        return -1;
    }

    lv_font_t* font_18 = &lv_font_montserrat_18;
    lv_obj_set_style_text_font(btn_daily_cost_label, (const lv_font_t *)font_18, 0);
    lv_obj_set_style_text_color(btn_daily_cost_label, lv_color_hex(0xFFFFFF), 0); // 设置文本颜色
    //lv_obj_set_style_text_color(btn_daily_cost_label, lv_color_hex(0x1985CE), 0);
    lv_label_set_text(btn_daily_cost_label, "Daily Cost"); // 设置文本内容 返回
    lv_obj_align(btn_daily_cost_label, LV_ALIGN_CENTER, 0, 0); // 设置对齐

    // 药品清单按键
    lv_obj_t* btn_medcine_list = lv_btn_create(obj_btn_cont);//lv_checkbox_create(obj_btn_cont);  //在parent对象上创建checkbox对象
    if (btn_medcine_list == NULL)
    {
        printf("[%s::%s:%d] btn_medcine_list create failed\n", THIS_FILE, __FUNCTION__, __LINE__);
        return ;
    }

    lv_obj_add_flag(btn_medcine_list, LV_OBJ_FLAG_CHECKABLE); // 添加可选中属性
    lv_obj_add_flag(btn_medcine_list, LV_OBJ_FLAG_EVENT_BUBBLE); // 添加事件传导
    lv_obj_set_style_pad_all(btn_medcine_list, 0, 0); //内部padding填充
    lv_obj_set_style_radius(btn_medcine_list, 0, 0); //圆角弧度
    lv_obj_set_style_bg_opa(btn_medcine_list, LV_OPA_COVER, 0);
    lv_obj_set_style_bg_color(btn_medcine_list, lv_color_hex(0xFFFFFF), 0);
    lv_obj_set_style_bg_color(btn_medcine_list, lv_color_hex(0x0D5EBF), LV_STATE_CHECKED); // 选中时的背景颜色
    lv_obj_set_size(btn_medcine_list, 142, 32); //设置大小
    lv_obj_align(btn_medcine_list, LV_ALIGN_TOP_LEFT, 142, 0);

    lv_obj_t * btn_medcine_list_label = lv_label_create(btn_medcine_list);
    if (btn_medcine_list_label == NULL)
    {
        printf("[%s::%s:%d] btn_medcine_list_label create failed\n", THIS_FILE, __FUNCTION__, __LINE__);
        return -1;
    }

    lv_obj_set_style_text_font(btn_medcine_list_label, (const lv_font_t *)font_18, 0);
    //lv_obj_set_style_text_color(btn_medcine_list_label, lv_color_hex(0xFFFFFF), LV_STATE_CHECKED); // 设置文本颜色
    lv_obj_set_style_text_color(btn_medcine_list_label, lv_color_hex(0x1985CE), 0);
    lv_label_set_text(btn_medcine_list_label, "Medcine List"); // 设置文本内容 返回
    lv_obj_align(btn_medcine_list_label, LV_ALIGN_CENTER, 0, 0); // 设置对齐

    lv_obj_t *cur_obj = lv_obj_get_child(obj_btn_cont, active_index);
    if (cur_obj != NULL)
    {
        lv_obj_add_state(lv_obj_get_child(obj_btn_cont, active_index), LV_STATE_CHECKED);
    }
}

下面是运行效果:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: LVGL V8 是一款高性能嵌入式图形库,它的中文手册对于中国开发者来说是一份非常重要的资料。LVGL V8 中文手册详细介绍了该库的各种特性、使用方法和实现原理。其中包括了 LVGL V8 的基础结构、对象、图元、样式等基础概念,还有详细的 API 参考和使用示例。 手册开头介绍了 LVGL V8 的基础知识,包括该库的基础设计、适用范围、适配平台等内容。接着,手册通过一个简单的 Hello World 项目介绍了如何在开发板上使用 LVGL V8,还介绍了如何使用 LVGL 的物理内存布局优化机制,避免使用较大的内存块。 在 LVGL V8 的中文手册中,对象是最核心的概念,手册详细介绍了各种对象的类型与用法,如基础对象、容器对象、文本对象、图像对象等。手册还介绍了 LVGL 的事件模型,解释了事件回调函数的使用方法和意义。除此之外,手册还介绍了 LVGL 的样式系统、动画框架等细节内容。 总体来说,LVGL V8 的中文手册非常详细,对于希望在嵌入式平台上使用 LVGL 开发界面的开发者来说,是一份非常重要的资料。手册详细介绍了该库的各种概念和细节,并提供了丰富的使用示例,非常适合初学者和专业开发人员使用。 ### 回答2: lvgl v8中文手册是一个相当详细、全面的用户手册,该手册主要是为了方便开发者在使用lvgl v8时可以快速入门,解决在实际开发过程中所遇到的各种问题。以下是本人对lvgl v8中文手册的一些了解和使用体验。 首先,lvgl v8中文手册的内容十分详细和系统,涉及的知识点涵盖了lvgl v8的核心概念、基础组件、布局、主题、动画、图像等方面的内容,而且每一章节都有大量的实例代码和图例,方便用户理解和学习。 其次,lvgl v8中文手册的组织结构十分清晰,每个章节都有明确的标题和目录,使得用户可以轻松找到所需的内容。而且,手册中的例子和代码片段也很详细,可以帮助用户更加深入地理解各个组件的使用方法和实现原理。 另外,lvgl v8中文手册还给出了各种样式、主题以及动画效果,这些都是使用lvgl v8时需要注意的一些方面,而且lvgl v8中文手册给出的解决方案和最佳实践也很实用,可以帮助用户在开发过程中避免一些常见的错误。 总之,lvgl v8中文手册是一个非常优秀的开发文档,对需要使用lvgl v8的开发者来说是一个不可或缺的参考工具,对于刚开始接触和了解lvgl v8的用户,这个手册更是一个非常好的教程,可以帮助他们顺利入门。 ### 回答3: LVGL v8是一款基于C语言开发的开源GUI库,具有轻量级、高效、可裁剪、跨平台等特点,适用于各种嵌入式应用的UI设计和开发。其中文手册详细介绍了LVGL v8库的使用方法、API接口、示例代码等内容,可以很好地帮助开发人员学习和掌握该库的使用。 手册的目录结构清晰、条理分明,涵盖了LVGL v8库的各个方面,包括库的概述、主循环、基本对象、容器对象、图形对象、矢量对象、特效、输入和操作、图像和字体、样式、动画、调试等内容。每个章节都以简洁明了的语言和示例代码的形式进行介绍,非常易于理解和实践。 在手册中,我们可以了解到LVGL v8库是如何创建窗口和控件、设置样式和属性、注册事件回调函数、处理输入事件等等。在对于各种对象的使用中,将以控件为主展示其使用方法。例如,对于文本框,手册详细介绍了其创建方式、风格设置、插入文本、删除文本、获取文本内容等相关功能。除此之外,手册中还介绍了LVGL v8库的特效、输入和操作、图像和字体、样式、动画等方面的内容。 总体上,LVGL v8中文手册内容丰富、详细全面、易于理解和操作。对于开发人员而言,该手册是一本不可多得的优秀参考书,可以帮助他们轻松地掌握LVGL v8的使用,并在实际项目中进行灵活高效的UI设计开发。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值