[LVGL] 自定义线段控件

LVGL8自带的画线控件使用起来不太方便,故有自定义线段控件的创作源:


#include "lvgl.h"
#include "stdlib.h"
#include "stdio.h"


#define MY_CLASS (&lv_view_line_class)

 /**********************
  *      TYPEDEFS
  **********************/
typedef struct
{
    lv_point_t line_points[2];
    uint32_t color;
    uint32_t width;
} view_line_param_t;


void view_line_set_pos(lv_obj_t* obj, int x0, int y0, int x1, int y1 );
void view_line_set_ver_pos(lv_obj_t* obj, int x0, int y0, uint16_t length);
void view_line_set_her_pos(lv_obj_t* obj, int x0, int y0, uint16_t length);
void view_line_set_color(lv_obj_t* obj, uint32_t color);
void view_line_set_width(lv_obj_t* obj, uint8_t width);

/**********************
 *  STATIC PROTOTYPES
 **********************/
static void view_line_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj);
static void view_line_destructor(const lv_obj_class_t* class_p, lv_obj_t* obj);

static const lv_obj_class_t lv_view_line_class = {
    .base_class = &lv_obj_class,
    .width_def = LV_SIZE_CONTENT,
    .height_def = LV_SIZE_CONTENT,
    .constructor_cb = view_line_constructor,
    .destructor_cb = view_line_destructor,
};

/**********************
 *   GLOBAL FUNCTIONS
 **********************/
lv_obj_t* view_line_create(lv_obj_t* parent, int x0, int y0, int x1, int y1, uint32_t color, uint32_t width)
{

    lv_obj_t* obj = lv_obj_class_create_obj(MY_CLASS, parent);
    view_line_param_t* line_parm = (view_line_param_t*)lv_mem_alloc(sizeof(view_line_param_t));
   
    if (line_parm != NULL)
    {
        line_parm->line_points[0].x = x0;
        line_parm->line_points[0].y = y0;
        line_parm->line_points[1].x = x1;
        line_parm->line_points[1].y = y1;
        line_parm->color = color;
        line_parm->width = width;
        lv_obj_set_user_data(obj, line_parm);
    }
    lv_obj_class_init_obj(obj);

    return obj;
}

static void view_line_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj)
{
    view_line_param_t* line_parm = (view_line_param_t*)lv_obj_get_user_data(obj);

    if (line_parm != NULL)
    {
        lv_obj_t* line_obj = lv_line_create(obj);
        lv_line_set_points(line_obj, line_parm->line_points, 2);
        lv_obj_set_style_line_width(line_obj, line_parm->width, 0);
        lv_obj_set_style_line_color(line_obj, lv_color_hex(line_parm->color), 0);
    }
}
static void view_line_destructor(const lv_obj_class_t* class_p, lv_obj_t* obj)
{
    view_line_param_t* line_parm = (view_line_param_t*)lv_obj_get_user_data(obj);
    if (line_parm != NULL)
        lv_mem_free(line_parm);
}

void view_line_set_color(lv_obj_t* obj, uint32_t color)
{
    view_line_param_t* line_parm = (view_line_param_t*)lv_obj_get_user_data(obj);
    lv_obj_t* line_obj = lv_obj_get_child(obj, 0);
    if (line_parm != NULL)
    {
        line_parm->color = color;
        lv_obj_set_style_line_color(line_obj, lv_color_hex(line_parm->color), 0);
    }
}

void view_line_set_width(lv_obj_t* obj, uint8_t width)
{
    view_line_param_t* line_parm = (view_line_param_t*)lv_obj_get_user_data(obj);
    lv_obj_t* line_obj = lv_obj_get_child(obj, 0);
    if (line_parm != NULL)
    {
        line_parm->width = width;
        lv_obj_set_style_line_width(line_obj, line_parm->width, 0);
    }
}

void view_line_set_pos(lv_obj_t* obj, int x0, int y0, int x1, int y1)
{
    view_line_param_t* line_parm = (view_line_param_t*)lv_obj_get_user_data(obj);
    lv_obj_t* line_obj = lv_obj_get_child(obj, 0);
    if (line_parm != NULL)
    {
        line_parm->line_points[0].x = x0;
        line_parm->line_points[0].y = y0;
        line_parm->line_points[1].x = x1;
        line_parm->line_points[1].y = y1;
        lv_line_set_points(line_obj, line_parm->line_points, 2);
    }
}


void view_line_set_her_pos(lv_obj_t* obj, int x0, int y0, uint16_t length)
{
    view_line_set_pos(obj, x0, y0, x0 + length, y0);
}

void view_line_set_ver_pos(lv_obj_t* obj, int x0, int y0, uint16_t length)
{
    view_line_set_pos(obj, x0, y0, x0, y0 + length);
}
//水平,垂直线段控件,可以使用空白的object控件修改属性来模拟线段
lv_obj_t* view_hor_line_create(lv_obj_t* parent, int x0, int y0, uint32_t line_length, uint32_t line_color, uint32_t line_width)
{
    lv_obj_t* line_obj = lv_obj_create(parent);
    lv_obj_clear_flag(line_obj, LV_OBJ_FLAG_SCROLLABLE);
    lv_obj_set_size(line_obj, line_length, line_width);
    lv_obj_set_style_bg_color(line_obj, lv_color_hex(line_color), 0);
    lv_obj_set_pos(line_obj, x0, y0);
    lv_obj_set_style_border_width(line_obj, 0, 0);
    return line_obj;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值