LVGL记录

左划动画
// 动画回调函数:修改对象的 x 坐标
static void set_x_anim(void* obj, int32_t x) {
lv_obj_set_x(obj, x); // 设置对象的 x 位置
}

void swipe_left_animation(lv_event_t * e) {
lv_obj_t* obj = lv_event_get_target(e);
lv_coord_t scroll_x = lv_obj_get_scroll_x(obj);
lv_anim_t anim;
lv_anim_init(&anim); // 初始化动画
lv_anim_set_var(&anim, obj); // 绑定目标对象
lv_anim_set_exec_cb(&anim, set_x_anim); // 设置动画回调函数
lv_anim_set_values(&anim, 0, -scroll_x ); // 从 x=0 移动到 x=-200
lv_anim_set_time(&anim, 300); // 动画时长 300ms
lv_anim_set_path_cb(&anim, lv_anim_path_ease_out); // 缓动效果(先快后慢)

// 设置 "返回原位" 的动画(反向播放)
lv_anim_set_playback_time(&anim, 300);   // 返回动画时长 300ms
lv_anim_set_playback_delay(&anim, 100);  // 停留 100ms 后再返回

lv_anim_start(&anim);  // 启动动画

}

static void handle_swipe_action(lv_event_t* e)
{
lv_obj_t* base = lv_event_get_current_target(e);
// CHECK_NULL(base, return);
lv_coord_t offset = lv_obj_get_scroll_x(base);
if (offset < 180) {
if (offset < 0)
lv_obj_set_scroll_dir(base, LV_DIR_RIGHT);
lv_obj_scroll_to_x(base, 0, LV_ANIM_ON);
} else {
lv_obj_set_scroll_dir(base, LV_DIR_HOR);
// if (remove_callback) {
// remove_callback(user_data);
// }
}
}

指针旋转
int angle = (hour % 12) * 30 + (minute * 0.5);
set_minute_hand_angle(img2, angle);
angle = (minute * 360) / 60;
set_minute_hand_angle(img3, angle);
void set_minute_hand_angle(lv_obj_t* img, int angle) {
lv_obj_set_style_transform_pivot_x(img, lv_obj_get_width(img) / 2, 0);
lv_obj_set_style_transform_pivot_y(img, lv_obj_get_height(img) / 2, 0);
lv_obj_set_style_transform_angle(img, angle * 10, 0);
}

在LVGL中实现开关按钮的点击切换功能
在LVGL中实现开关按钮(Switch)的点击切换功能非常简单,以下是几种实现方式:

基本实现方法

  1. 直接使用LVGL的开关组件
    c
    复制
    // 创建开关按钮
    lv_obj_t * sw = lv_switch_create(lv_scr_act());
    lv_obj_set_size(sw, 70, 30);
    lv_obj_align(sw, LV_ALIGN_CENTER, 0, 0);

// 设置初始状态(可选)
lv_obj_add_state(sw, LV_STATE_CHECKED); // 开启状态
// 或
lv_obj_clear_state(sw, LV_STATE_CHECKED); // 关闭状态
这样创建的开关按钮默认就有点击切换功能,不需要额外代码。

  1. 添加事件回调(如果需要自定义行为)

lv_obj_t * sw = lv_switch_create(lv_scr_act());
lv_obj_set_size(sw, 70, 30);
lv_obj_align(sw, LV_ALIGN_CENTER, 0, 0);

// 添加事件回调
lv_obj_add_event_cb(sw, switch_event_handler, LV_EVENT_VALUE_CHANGED, NULL);

// 事件处理函数
static void switch_event_handler(lv_event_t * e)
{
lv_obj_t * sw = lv_event_get_target(e);
if(lv_obj_has_state(sw, LV_STATE_CHECKED)) {
printf("开关已打开\n");
// 在这里添加开关打开时的处理代码
} else {
printf("开关已关闭\n");
// 在这里添加开关关闭时的处理代码
}
}
自定义样式(可选)
如果你想自定义开关按钮的外观:

static lv_style_t style_sw;
lv_style_init(&style_sw);
lv_style_set_bg_color(&style_sw, lv_palette_main(LV_PALETTE_RED)); // 关闭状态背景色
lv_style_set_bg_color(&style_sw, lv_palette_main(LV_PALETTE_GREEN)); // 开启状态背景色

lv_obj_add_style(sw, &style_sw, LV_PART_MAIN);
获取开关状态
在任何时候,你可以检查开关的当前状态:

if(lv_obj_has_state(sw, LV_STATE_CHECKED)) {
// 开关是打开状态
} else {
// 开关是关闭状态
}
或者直接获取值:

_Bool is_on = lv_obj_get_state(sw) & LV_STATE_CHECKED ? true : false;
LVGL的开关组件已经内置了点击切换功能,所以大多数情况下你不需要额外处理点击事件,除非你需要特别的自定义行为。

屏幕刷新
lv_display_t * disp = lv_display_get_default();
lv_refr_now(disp);

lv_obj_clean(root);

同层级始终放在最顶部
lv_obj_move_foreground(contain);

posted @ 2025-04-20 19:54  knock~  阅读(206)  评论(0)    收藏  举报