mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-28 07:03:00 +08:00
Added lv_arc_set_rotation, fixed drawing full circle
This commit is contained in:
parent
e805e59e8c
commit
7e8f6368d6
@ -131,7 +131,7 @@ void lv_arc_set_start_angle(lv_obj_t * arc, uint16_t start)
|
||||
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
start = start % 360;
|
||||
if(start > 360) start -= 360;
|
||||
|
||||
/*Too large move, the whole arc need to be invalidated anyway*/
|
||||
if(LV_MATH_ABS(start - ext->arc_angle_start) >= 180) {
|
||||
@ -164,8 +164,6 @@ void lv_arc_set_end_angle(lv_obj_t * arc, uint16_t end)
|
||||
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
end = end % 360;
|
||||
|
||||
/*Too large move, the whole arc need to be invalidated anyway*/
|
||||
if(LV_MATH_ABS(end - ext->arc_angle_end) >= 180) {
|
||||
lv_obj_invalidate(arc);
|
||||
@ -199,10 +197,12 @@ void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end)
|
||||
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
if(start > 360) start -= 360;
|
||||
|
||||
inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end);
|
||||
|
||||
ext->arc_angle_start = start % 360;
|
||||
ext->arc_angle_end = end % 360;
|
||||
ext->arc_angle_start = start;
|
||||
ext->arc_angle_end = end;
|
||||
|
||||
inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end);
|
||||
}
|
||||
@ -218,7 +218,7 @@ void lv_arc_set_bg_start_angle(lv_obj_t * arc, uint16_t start)
|
||||
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
start = start % 360;
|
||||
if(start > 360) start -= 360;
|
||||
|
||||
/*Too large move, the whole arc need to be invalidated anyway*/
|
||||
if(LV_MATH_ABS(start - ext->bg_angle_start) >= 180) {
|
||||
@ -251,8 +251,6 @@ void lv_arc_set_bg_end_angle(lv_obj_t * arc, uint16_t end)
|
||||
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
end = end % 360;
|
||||
|
||||
/*Too large move, the whole arc need to be invalidated anyway*/
|
||||
if(LV_MATH_ABS(end - ext->bg_angle_end) >= 180) {
|
||||
lv_obj_invalidate(arc);
|
||||
@ -284,15 +282,32 @@ void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end)
|
||||
LV_ASSERT_OBJ(arc, LV_OBJX_NAME);
|
||||
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
if(start > 360) start -= 360;
|
||||
|
||||
inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end);
|
||||
|
||||
ext->bg_angle_start = start % 360;
|
||||
ext->bg_angle_end = end % 360;
|
||||
ext->bg_angle_start = start;
|
||||
ext->bg_angle_end = end;
|
||||
|
||||
inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the rotation for the whole arc
|
||||
* @param arc pointer to an arc object
|
||||
* @param rotation_angle rotation angle
|
||||
*/
|
||||
void lv_arc_set_rotation(lv_obj_t * arc, uint16_t rotation_angle)
|
||||
{
|
||||
LV_ASSERT_OBJ(arc, LV_OBJX_NAME);
|
||||
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
ext->rotation_angle = rotation_angle;
|
||||
|
||||
lv_obj_invalidate(arc);
|
||||
}
|
||||
|
||||
/*=====================
|
||||
* Getter functions
|
||||
@ -405,7 +420,7 @@ static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area
|
||||
lv_draw_line_dsc_init(&arc_dsc);
|
||||
lv_obj_init_draw_line_dsc(arc, LV_ARC_PART_BG, &arc_dsc);
|
||||
|
||||
lv_draw_arc(x, y, r, ext->bg_angle_start, ext->bg_angle_end, clip_area, &arc_dsc);
|
||||
lv_draw_arc(x, y, r, ext->bg_angle_start + ext->rotation_angle, ext->bg_angle_end + ext->rotation_angle, clip_area, &arc_dsc);
|
||||
|
||||
lv_draw_line_dsc_init(&arc_dsc);
|
||||
lv_obj_init_draw_line_dsc(arc, LV_ARC_PART_INDIC, &arc_dsc);
|
||||
@ -417,7 +432,7 @@ static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area
|
||||
lv_coord_t bottom_indic = lv_obj_get_style_pad_bottom(arc, LV_ARC_PART_INDIC);
|
||||
r -= LV_MATH_MAX4(left_indic, right_indic, top_indic, bottom_indic);
|
||||
|
||||
lv_draw_arc(x, y, r, ext->arc_angle_start, ext->arc_angle_end, clip_area, &arc_dsc);
|
||||
lv_draw_arc(x, y, r, ext->arc_angle_start + ext->rotation_angle, ext->arc_angle_end + ext->rotation_angle, clip_area, &arc_dsc);
|
||||
}
|
||||
/*Post draw when the children are drawn*/
|
||||
else if(mode == LV_DESIGN_DRAW_POST) {
|
||||
@ -486,6 +501,11 @@ static lv_style_list_t * lv_arc_get_style(lv_obj_t * arc, uint8_t part)
|
||||
|
||||
static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle)
|
||||
{
|
||||
lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc);
|
||||
|
||||
start_angle += ext->rotation_angle;
|
||||
end_angle += ext->rotation_angle;
|
||||
|
||||
if(start_angle >= 360) start_angle -= 360;
|
||||
if(end_angle >= 360) end_angle -= 360;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user