| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-12-10 | yang | 初次建立 | ===== 实验十八:lv_gauge仪表盘 ===== ==== 一、仪表盘 ==== 仪表盘是一种带有刻度、标签和一根或多根指针的指示器。它的主要部分称为 **LV_GAUGE_PART_MAIN** 。它使用典型的背景样式属性绘制背景,并使用线和比例样式属性绘制“较小”刻度线。它还使用**text**属性设置比例标签的样式。**pad_inner** 用于设置刻度线和比例标签之间的间距。 **LV_GAUGE_PART_MAJOR** 是一个虚拟小部件,它使用 **line** 和 **scale** 样式属性描述了主要的刻度线并添加了标签。 **LV_GAUGE_PART_NEEDLE** 也是虚拟小部件,它通过 **line** 样式属性来描述指针。用 **pad_inner** 使指针长度小于刻度线的外半径。 ==== 二、设置指针和值 ==== 仪表盘可以显示一根指针或者多根指针。使用函数 **lv_gauge_set_needle_count(gauge, needle_num, color_array)** 可以设置指针数和每根指针颜色的数组。数组必须是静态或全局变量,因为LVGL仅存储其指针。 函数 **lv_gauge_set_value(gauge, needle_id, value)** 可以设置不同指针的值。 {{ :icore4t:icore4t_rtt_lvgl_18_1.png?direct |}} void lv_gui_run(void){ lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */ static lv_color_t needle_colors[3]; /* 创建指针颜色数组 */ needle_colors[0] = LV_COLOR_BLUE; /* 指针0蓝色 */ needle_colors[1] = LV_COLOR_ORANGE; /* 指针1橙色 */ needle_colors[2] = LV_COLOR_PURPLE; /* 指针2紫色 */ lv_obj_t * gauge1 = lv_gauge_create(lv_scr_act(), NULL);/* 创建仪表盘 */ lv_gauge_set_needle_count(gauge1, 3, needle_colors); /* 设置指针数,传入颜色列表 */ lv_obj_set_size(gauge1, 200, 200); /* 设置尺寸 */ lv_obj_align(gauge1, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */ lv_gauge_set_value(gauge1, 0, 10); /* 指针0值 */ lv_gauge_set_value(gauge1, 1, 20); /* 指针1值 */ lv_gauge_set_value(gauge1, 2, 30); /* 指针2值 */ } ==== 三、设置刻度与范围 ==== 设置仪表盘刻度的偏转角度,可以用** lv_gauge_set_angle_offset(gauge, angle)** 。仪表盘的刻度值范围可以通过 **lv_gauge_set_range(gauge, min, max)** 指定。默认范围是 **[0, 100]** 。 用户可以使用** lv_gauge_set_scale(gauge, angle, line_num, label_cnt)** 调整刻度角度范围以及刻度线和标签的数量。默认设置范围为 **220** 度,**21** 条刻度线和 **6** 个比例标签。 **line_num** 的计算公式如下,其中 **subdivision** 为想要设置的标签之间的“细分”行。 **line_num = (subdivision + 1) * (label_cnt - 1) + 1** 例如,我想在仪表盘上显示9个比例标签,将刻度值分为8份,刻度值范围设为 [0, 200],则每两个标签之间范围是25,将25细分为5,需要细分刻度 **subdivision** 为4,则刻度行 **line_num** 总共需要 ( 4 + 1)*( 9 - 1) + 1 = 41个。 {{ :icore4t:icore4t_rtt_lvgl_18_2.png?direct |}} void lv_gui_run(void){ lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */ static lv_color_t needle_colors[3]; /* 创建指针颜色数组 */ needle_colors[0] = LV_COLOR_BLUE; /* 指针0蓝色 */ needle_colors[1] = LV_COLOR_ORANGE; /* 指针1橙色 */ needle_colors[2] = LV_COLOR_PURPLE; /* 指针2紫色 */ lv_obj_t * gauge1 = lv_gauge_create(lv_scr_act(), NULL);/* 创建仪表盘 */ lv_gauge_set_needle_count(gauge1, 3, needle_colors); /* 设置指针数,传入颜色列表 */ lv_gauge_set_range(gauge1, 0, 200); /* 设置刻度值范围 */ lv_gauge_set_scale(gauge1, 270, 41, 9); /* 设置刻度细分 */ lv_obj_set_size(gauge1, 200, 200); /* 设置尺寸 */ lv_obj_align(gauge1, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */ lv_gauge_set_value(gauge1, 0, 10); /* 指针0值 */ lv_gauge_set_value(gauge1, 1, 20); /* 指针1值 */ lv_gauge_set_value(gauge1, 2, 30); /* 指针2值 */ } ==== 四、图像指针 ==== 指针形状默认为纯色线,不过图像也可以用作指针。指针图像应该是水平的,并指向右边('——> ')。要设置图像,请使用** lv_gauge_set_needle_img(gauge1, &img, pivot_x, pivot_y)** 。&img指针指向一个 **'lv_img_dsc_t'** 变量或一个图像的路径(不是 **'lv_img'** 对象)。**pivot_x**为图像旋转中心的X坐标, **pivot_y**为图像旋转中心的Y坐标(左上角为坐标原点)。 图像将以 **image_recolor_opa**(样式属性)强度重新着色为指针的颜色。关于图像设置,请参考Images图像(Overview)章节。 ==== 五、临界值 ==== 要设置临界值,请使用 **lv_gauge_set_critical_value(gauge, value)** 。此值之后,比例尺颜色将更改为 **scale_end_color**。默认临界值为**80**。 注意,临界值起始位置只能在刻度线上并且大于临界值才开始绘制,因此要设置临界线为150的话,最好传入参数149,如下例所示。 {{ :icore4t:icore4t_rtt_lvgl_18_3.png?direct |}} void lv_gui_run(void){ lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */ static lv_color_t needle_colors[3]; /* 创建指针颜色数组 */ needle_colors[0] = LV_COLOR_BLUE; /* 指针0蓝色 */ needle_colors[1] = LV_COLOR_ORANGE; /* 指针1橙色 */ needle_colors[2] = LV_COLOR_PURPLE; /* 指针2紫色 */ lv_obj_t * gauge1 = lv_gauge_create(lv_scr_act(), NULL);/* 创建仪表盘 */ lv_gauge_set_needle_count(gauge1, 3, needle_colors); /* 设置指针数,传入颜色列表 */ lv_gauge_set_range(gauge1, 0, 200); /* 设置刻度值范围 */ lv_gauge_set_scale(gauge1, 270, 41, 9); /* 设置刻度细分 */ lv_gauge_set_critical_value(gauge1, 149); /* 设置临界值 */ lv_obj_set_size(gauge1, 200, 200); /* 设置尺寸 */ lv_obj_align(gauge1, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */ lv_gauge_set_value(gauge1, 0, 10); /* 指针0值 */ lv_gauge_set_value(gauge1, 1, 20); /* 指针1值 */ lv_gauge_set_value(gauge1, 2, 30); /* 指针2值 */ }