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;
}

2194

被折叠的 条评论
为什么被折叠?



