弧(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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
    #include "../../../lv_examples.h"

    #if LV_USE_ARC

    void lv_ex_arc_1(void)
    {
      /*Create an Arc*/
      lv_obj_t * arc = lv_arc_create(lv_scr_act(), NULL);
      lv_arc_set_end_angle(arc, 200);
      lv_obj_set_size(arc, 150, 150);
      lv_obj_align(arc, NULL, LV_ALIGN_CENTER, 0, 0);
    }

    #endif

圆弧加载进度条

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

圆弧加载进度条

上述效果的示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    #include "../../../lv_examples.h"
    #if LV_USE_ARC

    /**
     * An `lv_task` to call periodically to set the angles of the arc
     * @param t
     */
    static void arc_loader(lv_task_t * t)
    {
            static int16_t a = 270;

            a+=5;

            lv_arc_set_end_angle(t->user_data, a);

            if(a >= 270 + 360) {
                    lv_task_del(t);
                    return;
            }
    }

    /**
     * Create an arc which acts as a loader.
     */
    void lv_ex_arc_2(void)
    {
      /*Create an Arc*/
      lv_obj_t * arc = lv_arc_create(lv_scr_act(), NULL);
      lv_arc_set_bg_angles(arc, 0, 360);
      lv_arc_set_angles(arc, 270, 270);
      lv_obj_align(arc, NULL, LV_ALIGN_CENTER, 0, 0);

      /* Create an `lv_task` to update the arc.
       * Store the `arc` in the user data*/
      lv_task_create(arc_loader, 20, LV_TASK_PRIO_LOWEST, arc);
    }

    #endif

相关API

Typedefs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    typedef uint8_t lv_arc_type_t;
    typedef uint8_t lv_arc_part_t;

    /* 弧的数据 */
    typedef struct {
            /* 此类型的新数据 */
            uint16_t rotation_angle;  /* 旋转角度 */
            uint16_t arc_angle_start; /* 开始角度 */
            uint16_t arc_angle_end;   /* 结束角度 */
            uint16_t bg_angle_start;  /* 背景开始角度 */
            uint16_t bg_angle_end;    /* 背景结束角度 */
            lv_style_list_t style_arc; /* 样式 */
            lv_style_list_t style_knob; /* 旋钮样式 */

            int16_t cur_value; /* 弧当前值 */
            int16_t min_value; /* 弧的最小值 */
            int16_t max_value; /* 弧的最大值 */
            uint16_t dragging    : 1;
            uint16_t type        : 2;
            uint16_t adjustable  : 1;
            uint16_t min_close   : 1;  /* 1:最后一个压角更接近最小端 */
            uint16_t chg_rate; /* 阻力角圆弧变化率(度/秒) */
            uint32_t last_tick; /* 弧的最后拖拽事件时间戳 */
            int16_t last_angle; /* 弧的最后拖曳角 */
    } lv_arc_ext_t;

enums

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    enum {
            LV_ARC_TYPE_NORMAL,    /* 正常类型 */
            LV_ARC_TYPE_SYMMETRIC, /* 对称类型 */
            LV_ARC_TYPE_REVERSE    /* 逆向类型 */
    };


    /* 弧的部分 */
    enum {
            LV_ARC_PART_BG = LV_OBJ_PART_MAIN,
            LV_ARC_PART_INDIC,
            LV_ARC_PART_KNOB,
            _LV_ARC_PART_VIRTUAL_LAST,
            _LV_ARC_PART_REAL_LAST = _LV_OBJ_PART_REAL_LAST,
    };

函数

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
    lv_obj_t * lv_arc_create(lv_obj_t * par,constlv_obj_t *copy)
    功能:创建弧对象
    返回:指向创建的弧的指针
    形参:
    par:指向对象的指针,它将是新弧的父对象
    copy:指向弧对象的指针,如果不为NULL,则将从其复制新对象

    void lv_arc_set_start_angle(lv_obj_t * arc,uint16_t start)
    功能:设置圆弧的起始角度。0度:右,90底等。
    形参:
    arc:指向弧对象的指针
    start:起始角度

    void lv_arc_set_end_angle(lv_obj_t * arc,uint16_t end )
    功能:设置圆弧的起始角度。0度:右,90底等。
    形参:
    arc:指向弧对象的指针
    end:结束角度

    void lv_arc_set_angles(lv_obj_t * arc,uint16_t start,uint16_t end)
    功能:设置开始和结束角度
    形参:
    arc:指向弧对象的指针
    start:起始角度
    end:结束角度

    void lv_arc_set_bg_start_angle(lv_obj_t * arc,uint16_t start)
    功能:设置弧形背景的起始角度。0度:右,90底等。
    形参:
    arc:指向弧对象的指针
    start:起始角度

    void lv_arc_set_bg_end_angle(lv_obj_t * arc,uint16_t end)
    功能:设置弧形背景的起始角度。0度:右,90底等。
    形参:
    arc:指向弧对象的指针
    end:结束角度

    void lv_arc_set_bg_angles(lv_obj_t * arc,uint16_t start,uint16_t end)
    功能:设置弧形背景的开始和结束角度
    形参:
    arc:指向弧对象的指针
    start:起始角度
    end:结束角度

    void lv_arc_set_rotation(lv_obj_t * arc,uint16_t rotation_angle)
    功能:设置整个圆弧的旋转
    形参:
    arc:指向弧对象的指针
    rotation_angle:旋转角度

    void lv_arc_set_type(lv_obj_t * arc,lv_arc_type_t type)
    功能:设置圆弧的类型。
    形参:
    arc:指向弧对象的指针
    type:圆弧型

    void lv_arc_set_value(lv_obj_t * arc,int16_t值)
    功能:在圆弧上设置一个新值
    形参:
    arc:指向弧对象的指针
    value:新价值

    void lv_arc_set_range(lv_obj_t * arc,int16_t min,int16_t max)
    功能:设置圆弧的最小值和最大值
    形参:
    arc:指向弧对象的指针
    min:最小值
    max:最大值

    void lv_arc_set_chg_rate(lv_obj_t * arc,uint16_t threshold)
    功能:设置圆弧旋钮增量位置的阈值。
    形参
    arc:指向弧对象的指针
    threshold:增量阈值

    void lv_arc_set_adjustable(lv_obj_t * arc,bool adjustable)
    功能:设置圆弧是否可调。
    形参:
    arc:指向弧对象的指针
    adjustable:圆弧是否具有可以拖动的旋钮

    uint16_t lv_arc_get_angle_start(lv_obj_t * arc)
    功能:获取圆弧的起始角度。
    返回:起始角度[0..360]
    形参:
    arc:指向弧对象的指针

    uint16_t lv_arc_get_angle_end(lv_obj_t * arc)
    功能:获取圆弧的末端角度。
    返回:端角[0..360]
    形参:
    arc:指向弧对象的指针

    uint16_t lv_arc_get_bg_angle_start(lv_obj_t * arc)
    功能:获取弧形背景的起始角度。
    返回:起始角度[0..360]
    形参:
    arc:指向弧对象的指针

    uint16_t lv_arc_get_bg_angle_end(lv_obj_t * arc)
    功能:获取弧形背景的终止角度。
    返回:端角[0..360]
    形参:
    arc:指向弧对象的指针

    lv_arc_type_t lv_arc_get_type(constlv_obj_t *arc)
    功能:获取圆弧是否为类型。
    返回:弧形类型
    形参:
    arc:指向弧对象的指针

    int16_t lv_arc_get_value(constlv_obj_t *arc)
    功能:获取圆弧的值
    返回:弧的值
    形参
    arc:指向弧对象的指针

    int16_t lv_arc_get_min_value(constlv_obj_t *arc)
    功能:获得圆弧的最小值
    返回:圆弧的最小值
    形参:
    arc:指向弧对象的指针

    int16_t lv_arc_get_max_value(constlv_obj_t *arc)
    功能:获取圆弧的最大值
    返回:弧的最大值
    形参:
    arc:指向弧对象的指针

    bool lv_arc_is_dragged(constlv_obj_t *arc)
    功能:给出弧线是否被拖动
    返回:true:拖动进行中,false:未拖动
    形参:
    arc:指向弧对象的指针

    bool lv_arc_get_adjustable(lv_obj_t * arc)
    功能:获取圆弧是否可调。
    返回:圆弧是否具有可以拖动的旋钮
    形参:
    arc:指向弧对象的指针