弧(lv_arc)

概述

弧由背景弧和前景弧组成。两者都可以具有起始角度和终止角度以及厚度。

零件和样式

弧的主要部分称为 LV_ARC_PART_MAIN 。它使用典型的背景样式属性绘制背景,并使用线型属性绘制圆弧。圆弧的大小和位置将遵守填充样式的属性。

LV_ARC_PART_INDIC 是虚拟零件,它使用线型属性绘制另一个弧。它的填充值是相对于背景弧线解释的。指示器圆弧的半径将根据最大填充值进行修改。

LV_ARC_PART_KNOB 是虚拟零件,它绘制在弧形指示器的末端。它使用所有背景属性和填充值。使用零填充时,旋钮的大小与指示器的宽度相同。较大的填充使其较大,较小的填充使其较小。

用法

角度

要设置背景角度,请使用 lv_arc_set_bg_angles(arc, start_angle, end_angle) 函数或 lv_arc_set_bg_start/end_angle(arc, start_angle) 。零度位于对象的右中间(3点钟),并且度沿顺时针方向增加。角度应在[0; 360]范围内。

同样, lv_arc_set_angles(arc, start_angle, end_angle) 函数或 lv_arc_set_start/end_angle(arc, start_angle) 函数设置指示器弧的角度。

回转

可以使用 lv_arc_set_rotation(arc, deg) 添加到0度位置的偏移量。

范围和值

除了手动设置角度外,弧还可以具有范围和值。要设置范围,请使用 lv_arc_set_range(arc, min, max) ,并设置一个值,请使用 lv_arc_set_value(arc, value) 。使用范围和值,指示器的角度将在背景角度之间映射。

注意,设置角度和值是独立的。应该使用值和角度设置。两者混合可能会导致意外的效果。

类型

弧可以具有不同的“类型”。它们用 lv_arc_set_type 设置。存在以下类型:

  • LV_ARC_TYPE_NORMAL 指示器弧顺时针绘制(最小电流)

  • LV_ARC_TYPE_REVERSE 指示器弧沿逆时针方向绘制(最大电流)

  • LV_ARC_TYPE_SYMMETRIC 从中间点绘制到当前值的指示弧。

事件

通用事件 外,弧还发送以下特殊事件:

  • LV_EVENT_VALUE_CHANGED 在按下/拖动弧以设置新值时发送。

了解有关 事件 的更多信息。

按键

对象类型不处理任何输入按键。

进一步了解 按键

范例

简单弧

http://photos.100ask.net/lvgl/04_widgets/02_arc/01_lv_ex_arc1.png

简单弧

上述效果的示例代码:

 1    #include "../../../lv_examples.h"
 2
 3    #if LV_USE_ARC
 4
 5    void lv_ex_arc_1(void)
 6    {
 7      /*Create an Arc*/
 8      lv_obj_t * arc = lv_arc_create(lv_scr_act(), NULL);
 9      lv_arc_set_end_angle(arc, 200);
10      lv_obj_set_size(arc, 150, 150);
11      lv_obj_align(arc, NULL, LV_ALIGN_CENTER, 0, 0);
12    }
13
14    #endif

圆弧加载进度条

http://photos.100ask.net/lvgl/04_widgets/02_arc/02_lv_ex_arc2.png

圆弧加载进度条

上述效果的示例代码:

 1    #include "../../../lv_examples.h"
 2    #if LV_USE_ARC
 3
 4    /**
 5     * An `lv_task` to call periodically to set the angles of the arc
 6     * @param t
 7     */
 8    static void arc_loader(lv_task_t * t)
 9    {
10            static int16_t a = 270;
11
12            a+=5;
13
14            lv_arc_set_end_angle(t->user_data, a);
15
16            if(a >= 270 + 360) {
17                    lv_task_del(t);
18                    return;
19            }
20    }
21
22    /**
23     * Create an arc which acts as a loader.
24     */
25    void lv_ex_arc_2(void)
26    {
27      /*Create an Arc*/
28      lv_obj_t * arc = lv_arc_create(lv_scr_act(), NULL);
29      lv_arc_set_bg_angles(arc, 0, 360);
30      lv_arc_set_angles(arc, 270, 270);
31      lv_obj_align(arc, NULL, LV_ALIGN_CENTER, 0, 0);
32
33      /* Create an `lv_task` to update the arc.
34       * Store the `arc` in the user data*/
35      lv_task_create(arc_loader, 20, LV_TASK_PRIO_LOWEST, arc);
36    }
37
38    #endif

相关API

Typedefs

 1    typedef uint8_t lv_arc_type_t;
 2    typedef uint8_t lv_arc_part_t;
 3
 4    /* 弧的数据 */
 5    typedef struct {
 6            /* 此类型的新数据 */
 7            uint16_t rotation_angle;  /* 旋转角度 */
 8            uint16_t arc_angle_start; /* 开始角度 */
 9            uint16_t arc_angle_end;   /* 结束角度 */
10            uint16_t bg_angle_start;  /* 背景开始角度 */
11            uint16_t bg_angle_end;    /* 背景结束角度 */
12            lv_style_list_t style_arc; /* 样式 */
13            lv_style_list_t style_knob; /* 旋钮样式 */
14
15            int16_t cur_value; /* 弧当前值 */
16            int16_t min_value; /* 弧的最小值 */
17            int16_t max_value; /* 弧的最大值 */
18            uint16_t dragging    : 1;
19            uint16_t type        : 2;
20            uint16_t adjustable  : 1;
21            uint16_t min_close   : 1;  /* 1:最后一个压角更接近最小端 */
22            uint16_t chg_rate; /* 阻力角圆弧变化率(度/秒) */
23            uint32_t last_tick; /* 弧的最后拖拽事件时间戳 */
24            int16_t last_angle; /* 弧的最后拖曳角 */
25    } lv_arc_ext_t;

enums

 1    enum {
 2            LV_ARC_TYPE_NORMAL,    /* 正常类型 */
 3            LV_ARC_TYPE_SYMMETRIC, /* 对称类型 */
 4            LV_ARC_TYPE_REVERSE    /* 逆向类型 */
 5    };
 6
 7
 8    /* 弧的部分 */
 9    enum {
10            LV_ARC_PART_BG = LV_OBJ_PART_MAIN,
11            LV_ARC_PART_INDIC,
12            LV_ARC_PART_KNOB,
13            _LV_ARC_PART_VIRTUAL_LAST,
14            _LV_ARC_PART_REAL_LAST = _LV_OBJ_PART_REAL_LAST,
15    };

函数

  1    lv_obj_t * lv_arc_create(lv_obj_t * par,constlv_obj_t *copy)
  2    功能:创建弧对象
  3    返回:指向创建的弧的指针
  4    形参:
  5    par:指向对象的指针,它将是新弧的父对象
  6    copy:指向弧对象的指针,如果不为NULL,则将从其复制新对象
  7
  8    void lv_arc_set_start_angle(lv_obj_t * arc,uint16_t start)
  9    功能:设置圆弧的起始角度。0度:右,90底等。
 10    形参:
 11    arc:指向弧对象的指针
 12    start:起始角度
 13
 14    void lv_arc_set_end_angle(lv_obj_t * arc,uint16_t end )
 15    功能:设置圆弧的起始角度。0度:右,90底等。
 16    形参:
 17    arc:指向弧对象的指针
 18    end:结束角度
 19
 20    void lv_arc_set_angles(lv_obj_t * arc,uint16_t start,uint16_t end)
 21    功能:设置开始和结束角度
 22    形参:
 23    arc:指向弧对象的指针
 24    start:起始角度
 25    end:结束角度
 26
 27    void lv_arc_set_bg_start_angle(lv_obj_t * arc,uint16_t start)
 28    功能:设置弧形背景的起始角度。0度:右,90底等。
 29    形参:
 30    arc:指向弧对象的指针
 31    start:起始角度
 32
 33    void lv_arc_set_bg_end_angle(lv_obj_t * arc,uint16_t end)
 34    功能:设置弧形背景的起始角度。0度:右,90底等。
 35    形参:
 36    arc:指向弧对象的指针
 37    end:结束角度
 38
 39    void lv_arc_set_bg_angles(lv_obj_t * arc,uint16_t start,uint16_t end)
 40    功能:设置弧形背景的开始和结束角度
 41    形参:
 42    arc:指向弧对象的指针
 43    start:起始角度
 44    end:结束角度
 45
 46    void lv_arc_set_rotation(lv_obj_t * arc,uint16_t rotation_angle)
 47    功能:设置整个圆弧的旋转
 48    形参:
 49    arc:指向弧对象的指针
 50    rotation_angle:旋转角度
 51
 52    void lv_arc_set_type(lv_obj_t * arc,lv_arc_type_t type)
 53    功能:设置圆弧的类型。
 54    形参:
 55    arc:指向弧对象的指针
 56    type:圆弧型
 57
 58    void lv_arc_set_value(lv_obj_t * arc,int16_t值)
 59    功能:在圆弧上设置一个新值
 60    形参:
 61    arc:指向弧对象的指针
 62    value:新价值
 63
 64    void lv_arc_set_range(lv_obj_t * arc,int16_t min,int16_t max)
 65    功能:设置圆弧的最小值和最大值
 66    形参:
 67    arc:指向弧对象的指针
 68    min:最小值
 69    max:最大值
 70
 71    void lv_arc_set_chg_rate(lv_obj_t * arc,uint16_t threshold)
 72    功能:设置圆弧旋钮增量位置的阈值。
 73    形参
 74    arc:指向弧对象的指针
 75    threshold:增量阈值
 76
 77    void lv_arc_set_adjustable(lv_obj_t * arc,bool adjustable)
 78    功能:设置圆弧是否可调。
 79    形参:
 80    arc:指向弧对象的指针
 81    adjustable:圆弧是否具有可以拖动的旋钮
 82
 83    uint16_t lv_arc_get_angle_start(lv_obj_t * arc)
 84    功能:获取圆弧的起始角度。
 85    返回:起始角度[0..360]
 86    形参:
 87    arc:指向弧对象的指针
 88
 89    uint16_t lv_arc_get_angle_end(lv_obj_t * arc)
 90    功能:获取圆弧的末端角度。
 91    返回:端角[0..360]
 92    形参:
 93    arc:指向弧对象的指针
 94
 95    uint16_t lv_arc_get_bg_angle_start(lv_obj_t * arc)
 96    功能:获取弧形背景的起始角度。
 97    返回:起始角度[0..360]
 98    形参:
 99    arc:指向弧对象的指针
100
101    uint16_t lv_arc_get_bg_angle_end(lv_obj_t * arc)
102    功能:获取弧形背景的终止角度。
103    返回:端角[0..360]
104    形参:
105    arc:指向弧对象的指针
106
107    lv_arc_type_t lv_arc_get_type(constlv_obj_t *arc)
108    功能:获取圆弧是否为类型。
109    返回:弧形类型
110    形参:
111    arc:指向弧对象的指针
112
113    int16_t lv_arc_get_value(constlv_obj_t *arc)
114    功能:获取圆弧的值
115    返回:弧的值
116    形参
117    arc:指向弧对象的指针
118
119    int16_t lv_arc_get_min_value(constlv_obj_t *arc)
120    功能:获得圆弧的最小值
121    返回:圆弧的最小值
122    形参:
123    arc:指向弧对象的指针
124
125    int16_t lv_arc_get_max_value(constlv_obj_t *arc)
126    功能:获取圆弧的最大值
127    返回:弧的最大值
128    形参:
129    arc:指向弧对象的指针
130
131    bool lv_arc_is_dragged(constlv_obj_t *arc)
132    功能:给出弧线是否被拖动
133    返回:true:拖动进行中,false:未拖动
134    形参:
135    arc:指向弧对象的指针
136
137    bool lv_arc_get_adjustable(lv_obj_t * arc)
138    功能:获取圆弧是否可调。
139    返回:圆弧是否具有可以拖动的旋钮
140    形参:
141    arc:指向弧对象的指针