mirror of
https://github.com/lvgl/lvgl.git
synced 2026-05-20 12:32:18 +08:00
d76a346376
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
135 lines
4.3 KiB
C
135 lines
4.3 KiB
C
#include "../lv_examples.h"
|
|
#if LV_BUILD_EXAMPLES && LV_USE_LABEL
|
|
|
|
#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS
|
|
|
|
static void position_bullet(lv_event_t * e, lv_point_t * p)
|
|
{
|
|
lv_indev_t * indev = (lv_indev_t *) lv_event_get_param(e);
|
|
lv_indev_get_point(indev, p);
|
|
|
|
lv_obj_t * bullet = lv_event_get_target_obj(e);
|
|
lv_obj_t * parent = lv_obj_get_parent(bullet);
|
|
|
|
p->x -= lv_obj_get_x(parent);
|
|
p->y -= lv_obj_get_y(parent);
|
|
|
|
int32_t w = lv_obj_get_width(parent);
|
|
int32_t h = lv_obj_get_height(parent);
|
|
lv_obj_set_pos(bullet, LV_CLAMP(5, p->x, w - 20), LV_CLAMP(5, p->y, h - 20));
|
|
}
|
|
|
|
static void start_event_cb(lv_event_t * e)
|
|
{
|
|
lv_style_t * style = (lv_style_t *) lv_event_get_user_data(e);
|
|
lv_style_value_t v;
|
|
lv_style_get_prop(style, LV_STYLE_BG_GRAD, &v);
|
|
lv_grad_dsc_t * dsc = (lv_grad_dsc_t *)v.ptr;
|
|
|
|
lv_point_t p;
|
|
position_bullet(e, &p);
|
|
|
|
lv_obj_t * bullet = lv_event_get_target_obj(e);
|
|
lv_obj_t * parent = lv_obj_get_parent(bullet);
|
|
p.x -= lv_obj_get_width(parent) / 2;
|
|
p.y -= lv_obj_get_height(parent) / 2;
|
|
|
|
dsc->params.conical.start_angle = lv_atan2(p.y, p.x);
|
|
lv_obj_invalidate(parent);
|
|
}
|
|
|
|
static void end_event_cb(lv_event_t * e)
|
|
{
|
|
lv_style_t * style = (lv_style_t *) lv_event_get_user_data(e);
|
|
lv_style_value_t v;
|
|
lv_style_get_prop(style, LV_STYLE_BG_GRAD, &v);
|
|
lv_grad_dsc_t * dsc = (lv_grad_dsc_t *)v.ptr;
|
|
|
|
lv_point_t p;
|
|
position_bullet(e, &p);
|
|
|
|
lv_obj_t * bullet = lv_event_get_target_obj(e);
|
|
lv_obj_t * parent = lv_obj_get_parent(bullet);
|
|
p.x -= lv_obj_get_width(parent) / 2;
|
|
p.y -= lv_obj_get_height(parent) / 2;
|
|
|
|
dsc->params.conical.end_angle = lv_atan2(p.y, p.x);
|
|
lv_obj_invalidate(parent);
|
|
}
|
|
|
|
/**
|
|
* @title Conical gradient with draggable angles
|
|
* @brief Drag two bullets to set the start and end angles of a conical gradient.
|
|
*
|
|
* A centered 80% by 80% object carries a two-stop conical gradient built
|
|
* with `lv_grad_init_stops` and `lv_grad_conical_init` centered at 50% by
|
|
* 50% sweeping from 0 to 180 degrees with `LV_GRAD_EXTEND_PAD`. Two small
|
|
* buttons act as angle handles; their `LV_EVENT_PRESSING` callbacks read
|
|
* the pointer, reposition the handle, and recompute
|
|
* `dsc->params.conical.start_angle` or `dsc->params.conical.end_angle`
|
|
* with `lv_atan2` relative to the parent center before invalidating it.
|
|
* When `LV_USE_DRAW_SW_COMPLEX_GRADIENTS` is disabled, the example
|
|
* instead shows a single label noting the dependency.
|
|
*/
|
|
void lv_example_grad_4(void)
|
|
{
|
|
static const lv_color_t grad_colors[2] = {
|
|
LV_COLOR_MAKE(0xff, 0x00, 0x00),
|
|
LV_COLOR_MAKE(0x00, 0xff, 0x00),
|
|
};
|
|
|
|
static const lv_opa_t grad_opa[2] = {
|
|
LV_OPA_100,
|
|
LV_OPA_0,
|
|
};
|
|
|
|
static lv_style_t style;
|
|
lv_style_init(&style);
|
|
|
|
/*First define a color gradient. In this example we use a purple to black color map.*/
|
|
static lv_grad_dsc_t grad;
|
|
|
|
lv_grad_init_stops(&grad, grad_colors, grad_opa, NULL, sizeof(grad_colors) / sizeof(lv_color_t));
|
|
|
|
lv_grad_conical_init(&grad, lv_pct(50), lv_pct(50), 0, 180, LV_GRAD_EXTEND_PAD);
|
|
|
|
/*Set gradient as background*/
|
|
lv_style_set_bg_grad(&style, &grad);
|
|
lv_style_set_border_width(&style, 2);
|
|
lv_style_set_pad_all(&style, 0);
|
|
lv_style_set_radius(&style, 12);
|
|
|
|
/*Create an object with the new style*/
|
|
lv_obj_t * obj = lv_obj_create(lv_screen_active());
|
|
lv_obj_add_style(obj, &style, 0);
|
|
lv_obj_set_size(obj, lv_pct(80), lv_pct(80));
|
|
lv_obj_center(obj);
|
|
|
|
lv_obj_t * start = lv_button_create(obj);
|
|
lv_obj_set_size(start, 15, 15);
|
|
lv_obj_set_style_bg_color(start, lv_color_hex(0x0000ff), 0);
|
|
lv_obj_add_event_cb(start, start_event_cb, LV_EVENT_PRESSING, &style);
|
|
lv_obj_set_ext_click_area(start, 5);
|
|
lv_obj_set_pos(start, lv_pct(80), lv_pct(50));
|
|
|
|
lv_obj_t * end = lv_button_create(obj);
|
|
lv_obj_set_size(end, 15, 15);
|
|
lv_obj_set_style_bg_color(end, lv_color_hex(0x00ffff), 0);
|
|
lv_obj_add_event_cb(end, end_event_cb, LV_EVENT_PRESSING, &style);
|
|
lv_obj_set_ext_click_area(end, 5);
|
|
lv_obj_set_pos(end, lv_pct(20), lv_pct(50));
|
|
}
|
|
|
|
#else
|
|
|
|
void lv_example_grad_4(void)
|
|
{
|
|
lv_obj_t * label = lv_label_create(lv_screen_active());
|
|
lv_label_set_text(label, "LV_USE_DRAW_SW_COMPLEX_GRADIENTS needs to be enabled");
|
|
lv_obj_center(label);
|
|
}
|
|
|
|
#endif /*LV_USE_DRAW_SW_COMPLEX_GRADIENTS*/
|
|
|
|
#endif
|