一、Arc 简介
1.1 Overview(概述)
圆弧由背景和前景弧组成。前景(指示器)可以进行触摸调整。
1.2 Parts and Styles(部分和风格)
- LV_PART_MAIN: 圆弧的背景部分。使用典型的背景样式属性绘制背景,使用圆弧样式属性绘制圆弧。 圆弧的大小和位置可以通过
padding 样式调整。 - LV_PART_INDICATOR: 圆弧的指示器部分。使用 arc 样式属性绘制另一个圆弧。 它的填充值是相对于背景弧来设置的。
- LV_PART_KNOB:圆弧的旋钮部分。使用所有背景属性和填充值在指标的末尾绘制一个旋钮。如果使用零填充,旋钮大小与指示器的宽度相同。较大的填充使其更大,较小的填充使其更小。
注:使用样式时,修改LV_PART_MAIN和LV_PART_INDICATOR圆弧的style,需要设置arc_bg_color等,而不是bg_color。
二、Arc 使用
2.1 Value and range(值和范围)
2.11 零点
使用arc圆弧需要知道圆弧的起始点在哪,便于后续设置设置起始角度;零度位于对象的中间右侧(3 点钟方向),并且度数沿顺时针方向增加。 角度应在 [0;360] 范围内。
2.12 设置值和角度
设置圆弧的值,使用接口set_value,默认值是0-100
void lv_arc_set_range(lv_obj_t* obj, int16_t min, int16_t max); //设置value的范围
void lv_arc_set_value(lv_obj_t* obj, int16_t value); //设置arc的value具体指
设置圆弧的角度
void lv_arc_set_angles(lv_obj_t* obj, uint16_t start, uint16_t end);
也可以单独设置开始和结束的角度
void lv_arc_set_start_angle(lv_obj_t* obj, uint16_t start);
void lv_arc_set_end_angle(lv_obj_t* obj, uint16_t end);
设置圆弧背景的角度,注意这里的背景是指arc的主体,不是大背景
void lv_arc_set_bg_angles(lv_obj_t* obj, uint16_t start, uint16_t end);
void lv_arc_set_bg_start_angle(lv_obj_t* obj, uint16_t start);
void lv_arc_set_bg_end_angle(lv_obj_t* obj, uint16_t end);
2.2 Rotation(旋转)
可以使用 lv_arc_set_rotation(arc, deg) 添加到 0 度位置的偏移量,通过调整0度坐标来实现旋转。
2.3 半径和圆角
2.31 半径
LVGL没有提供设置圆弧半径的API,实际上我们可以修改arc对象的size来实现圆弧半径的修改 lv_obj_set_size 。
圆弧半径也就是大小的修改方式已经找到了,那还有一个重点就是圆弧的宽度怎么设置呢?
如果有使用过LVGL7.11版本的同学,在7.11版本设置arc圆弧的的宽度是采用设置line_width的,在8.3版本则是使用set_arc_width来设置的,较7.11版本更加直观。
void lv_obj_set_style_arc_width(struct _lv_obj_t* obj, lv_coord_t value, lv_style_selector_t selector) ;
//eg. 设置圆弧主体的宽度
lv_obj_set_style_arc_width(arc,20,LV_PART_MAIN);
//eg. 设置圆弧指示器的宽度
lv_obj_set_style_arc_width(arc,20,LV_PART_INDICATOR );
2.32 圆角
设置圆弧圆角,熟悉LVGL的同学可能会想到这个接口
void lv_obj_set_style_radius(struct _lv_obj_t* obj, lv_coord_t value, lv_style_selector_t selector);
但是真正使用这个接口去实现圆弧主体的圆角或直角时,发现设置为LV_PART_MAIN,并没有反应,是因为设置的selector 是圆弧的背景,这里的背景也有一样bg_opa透明度是默认设置为0的,当你把透明度设置为255后会发现。
因此设置圆弧是圆角还是直角是采用:
//注意:true: 圆形, false: 垂直线结束
void lv_obj_set_style_arc_rounded(struct _lv_obj_t* obj, bool value, lv_style_selector_t selector);
三、Arc API
lv_obj_t* lv_arc_create(lv_obj_t* parent);
void lv_arc_set_start_angle(lv_obj_t * arc, uint16_t start); //设置圆弧的起始角度。0度:右,90度下等。
void lv_arc_set_end_angle(lv_obj_t * arc, uint16_t end); //设置弧的结束角度。0度:右,90度下等。
void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end); //设置起始和结束角度
void lv_arc_set_bg_start_angle(lv_obj_t * arc, uint16_t start); //设置弧背景的起始角度。0度:右,90度下等。
void lv_arc_set_bg_end_angle(lv_obj_t * arc, uint16_t end); //设置弧背景的起始角度。0度:右,90度下等。
void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end);//设置弧背景的起始角和结束角
void lv_arc_set_rotation(lv_obj_t * arc, uint16_t rotation); //设置整个弧线的旋转
void lv_arc_set_mode(lv_obj_t * arc, lv_arc_mode_t type); //设置圆弧类型。
void lv_arc_set_value(lv_obj_t * arc, int16_t value); //在弧线上设置一个新值
void lv_arc_set_range(lv_obj_t * arc, int16_t min, int16_t max); //设置圆弧的最大值和最小值
void lv_arc_set_change_rate(lv_obj_t * arc, uint16_t rate); //设置一个变化率来限制电弧到达压下点的速度。
uint16_t lv_arc_get_angle_start(lv_obj_t * obj); //获取弧的起始角度。
uint16_t lv_arc_get_angle_end(lv_obj_t * obj); //获取弧的结束角。
uint16_t lv_arc_get_bg_angle_start(lv_obj_t * obj); //获取弧背景的起始角度。
uint16_t lv_arc_get_bg_angle_end(lv_obj_t * obj); //获取弧背景的结束角度。
int16_t lv_arc_get_value(const lv_obj_t * obj); //获取弧的值
int16_t lv_arc_get_min_value(const lv_obj_t * obj); //获取弧的最小值
int16_t lv_arc_get_max_value(const lv_obj_t * obj); //获取弧线的最大值
lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj); //获取弧线是否为type类型。