LVGL scale功能的介绍

本文深入介绍了LittlevGL库中刻度对象的创建、设置和管理,包括`lv_scale_create`、`lv_scale_set_mode`、`lv_scale_set_label_show`等功能函数。文章详细分析了这些函数的代码实现,展示了如何设置刻度的模式、标签显示、主刻度间隔、值域范围等属性,以及如何利用这些功能创建和定制刻度对象,以适应不同的用户界面需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lv_scale_create

lv_scale_create 函数是 lv_scale 类的一个全局函数,用于创建一个新的刻度对象。下面是 lv_scale_create 函数的代码,我将对其进行详细分析和注释:

/** 
 * 创建一个新的刻度对象。
 * @param parent 父对象,新创建的刻度对象将会成为这个对象的子对象。
 * @return 创建的刻度对象的指针。
 */
lv_obj_t * lv_scale_create(lv_obj_t * parent)
{
    LV_LOG_INFO("begin"); // 开始记录日志信息

    // 使用类创建对象的宏,分配内存并初始化基础对象
    lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);

    // 初始化对象,调用基础对象的构造函数
    lv_obj_class_init_obj(obj);

    // 返回创建的刻度对象的指针
    return obj;
}

在这个函数中:

  • LV_LOG_INFO("begin"); 记录日志信息,这通常用于调试,表明对象创建过程的开始。

  • lv_obj_class_create_obj(MY_CLASS, parent); 是一个宏,它使用 lv_scale 类的元数据来创建一个新的对象。MY_CLASS 是指向 lv_scale_class 的指针,这是在文件顶部定义的刻度类的类定义。parent 参数指定了新刻度对象的父对象,新对象会成为这个父对象的子对象。

  • lv_obj_class_init_obj(obj); 调用基础对象的构造函数来完成对象的初始化。这是 LittlevGL 中对象创建的标准过程,确保对象被正确设置。

最终,函数返回新创建的刻度对象的指针,这个指针可以用于后续的设置和操作,比如添加到界面上、设置属性或者添加事件回调等。

这个函数是 lv_scale 类的入口点,提供了一个简洁的 API 来创建和管理刻度对象。它是面向对象编程和工厂模式在图形库设计中的典型应用。

lv_scale_set_mode

lv_scale_set_mode 函数是用于设置刻度对象模式的函数。模式决定了刻度的布局方式,比如水平、垂直或者圆形等。下面是 lv_scale_set_mode 函数的代码,我将对其进行详细分析和注释:

/**
 * 设置刻度对象的模式。
 * @param obj 指向刻度对象的指针。
 * @param mode 要设置的模式,可以是水平、垂直或者圆形等。
 */
void lv_scale_set_mode(lv_obj_t * obj, lv_scale_mode_t mode)
{
    // 断言检查以确保传入的对象是lv_scale类的对象
    LV_ASSERT_OBJ(obj, MY_CLASS);

    // 将传入的刻度对象转换为lv_scale_t类型,以便访问类特定的成员变量
    lv_scale_t * scale = (lv_scale_t *)obj;

    // 设置刻度对象的模式为传入的mode参数
    scale->mode = mode;

    // 标记对象为无效,这样它的绘制函数会被调用,以应用新的模式设置
    lv_obj_invalidate(obj);
}

在这个函数中:

  • LV_ASSERT_OBJ(obj, MY_CLASS); 是一个断言,用来确保传入的 obj 指针确实是 lv_scale 类型的对象。如果断言失败,说明传入的对象不是预期的类型,这在调试过程中非常有用。

  • lv_scale_t * scale = (lv_scale_t *)obj;lv_obj_t 类型的对象转换为 lv_scale_t 类型。lv_scale_tlv_scale 类的内部表示,可能包含额外的成员变量和函数,用于实现刻度的具体功能。

  • scale->mode = mode; 将刻度对象的模式设置为传入的 mode 参数。mode 是一个枚举值,定义了刻度的不同布局方式。

  • lv_obj_invalidate(obj); 这个函数调用会标记对象为无效,这意味着在下一次绘制循环中,对象的事件处理函数会被调用,以重新绘制对象,反映出新的模式设置。

lv_scale_set_mode 函数是设置刻度外观和布局的重要部分,它允许开发者根据应用程序的需求改变刻度的显示方式。通过这种方式,同一个刻度对象可以适应不同的用户界面设计。

lv_scale_set_total_tick_count

lv_scale_set_total_tick_count 函数用于设置刻度对象的总刻度数量。这个函数允许开发者根据需要调整刻度的总数,从而改变刻度的密度。以下是 lv_scale_set_total_tick_count 函数的代码,我将对其进行详细分析和注释:

/**
 * 设置刻度对象的总刻度数量。
 * @param obj 指向刻度对象的指针。
 * @param total_tick_count 要设置的总刻度数量。
 */
void lv_scale_set_total_tick_count(lv_obj_t * obj, uint32_t total_tick_count)
{
    // 断言检查以确保传入的对象是lv_scale类的对象
    LV_ASSERT_OBJ(obj, MY_CLASS);

    // 将传入的lv_obj_t类型的对象转换为lv_scale_t类型,以便访问类特定的成员变量
    lv_scale_t * scale = (lv_scale_t *)obj;

    // 设置刻度对象的总刻度数量为传入的total_tick_count参数
    scale->total_tick_count = total_tick_count;

    // 标记对象为无效,这样它的绘制函数会被调用,以应用新的总刻度数量设置
    lv_obj_invalidate(obj);
}

在这个函数中:

  • LV_ASSERT_OBJ(obj, MY_CLASS); 这行代码使用 LittlevGL 的宏来验证 obj 参数是否真的是一个刻度对象。如果验证失败,它通常会导致程序断言失败,这是一种运行时检查机制,有助于捕获错误。

  • lv_scale_t * scale = (lv_scale_t *)obj; 这行代码将基类指针 obj 转换为 lv_scale_t 类型的指针。lv_scale_t 是由文件中定义的具体刻度对象的数据结构,这样就能够访问该类型的特定成员。

  • scale->total_tick_count = total_tick_count; 这行代码设置刻度对象的总刻度计数到用户通过 total_tick_count 参数指定的值。这个值决定了刻度尺上将显示多少个刻度标记。

  • lv_obj_invalidate(obj); 这行代码标记刻度对象为无效,触发对象的重新绘制。在 LittlevGL 中,当你更改对象的状态或属性时,你需要手动使对象无效,以便调度它的重新绘制。这是 LittlevGL 的优化技术之一,可以避免不必要的绘制操作。

通过调用 lv_scale_set_total_tick_count 函数,开发者可以根据界面设计的要求,灵活地改变刻度的分布,无论是需要更精细的刻度还是更粗糙的刻度,都可以通过调整总刻度数量来实现。

lv_scale_set_major_tick_every

lv_scale_set_major_tick_every 函数用于设置刻度对象的主刻度间隔,即每隔多少个刻度显示一个主刻度。以下是 lv_scale_set_major_tick_every 函数的代码,我将对其进行详细分析和注释:

/**
 * 设置刻度对象的主刻度间隔。
 * @param obj 指向刻度对象的指针。
 * @param major_tick_every 每隔多少个刻度显示一个主刻度。
 */
void lv_scale_set_major_tick_every(lv_obj_t * obj, uint32_t major_tick_every)
{
    // 断言检查以确保传入的对象是lv_scale类的对象
    LV_ASSERT_OBJ(obj, MY_CLASS);

    // 将传入的lv_obj_t类型的对象转换为lv_scale_t类型,以便访问类特定的成员变量
    lv_scale_t * scale = (lv_scale_t *)obj;

    // 设置刻度对象的主刻度间隔为传入的major_tick_every参数
    scale->major_tick_every = major_tick_every;

    // 标记对象为无效,这样它的绘制函数会被调用,以应用新的主刻度间隔设置
    lv_obj_invalidate(obj);
}

在这个函数中:

  • LV_ASSERT_OBJ(obj, MY_CLASS); 这行代码使用 LittlevGL 的宏来验证 obj 参数是否真的是一个刻度对象。如果 obj 不是 lv_scale 类型的对象,这个宏可能会触发一个断言失败,这是一种确保对象类型正确性的手段。

  • lv_scale_t * scale = (lv_scale_t *)obj; 这行代码将 lv_obj_t 类型的对象指针转换为 lv_scale_t 类型。lv_scale_t 是刻度对象的具体数据结构,它包含了刻度对象的状态和属性。

  • scale->major_tick_every = major_tick_every; 这行代码设置刻度对象的主刻度间隔属性。major_tick_every 参数定义了每隔多少个刻度显示一个主刻度,主刻度通常比普通刻度更宽或更显眼。

  • lv_obj_invalidate(obj); 这行代码会标记刻度对象为无效状态,这样 LittlevGL 就知道需要重新绘制该对象。在对象的属性(如主刻度间隔)改变后,需要重新绘制对象以反映这些更改。

通过调用 lv_scale_set_major_tick_every 函数,开发者可以控制刻度尺上主刻度的分布,这对于改善用户界面的可读性和美观性非常有用。

lv_scale_set_label_show

lv_scale_set_label_show 函数用于控制刻度对象是否显示标签。以下是 lv_scale_set_label_show 函数的代码,我将对其进行详细分析和注释:

/**
 * 设置刻度对象是否显示标签。
 * @param obj 指向刻度对象的指针。
 * @param show_label 布尔值,指示是否显示标签。true 表示显示标签,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值