esp-idf/examples/peripherals/lcd/lvgl/main/lvgl_demo_ui.c
2021-09-13 15:08:48 +08:00

100 lines
2.9 KiB
C

/* LCD LVGL UI example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <math.h>
#include "lvgl.h"
#ifndef PI
#define PI (3.14159f)
#endif
// LVGL image declare
LV_IMG_DECLARE(esp_logo)
LV_IMG_DECLARE(esp_text)
static lv_obj_t *arc[3];
static lv_obj_t *img_logo;
static lv_obj_t *img_text;
static lv_color_t arc_color[] = {
LV_COLOR_MAKE(232, 87, 116),
LV_COLOR_MAKE(126, 87, 162),
LV_COLOR_MAKE(90, 202, 228),
};
static void anim_timer_cb(lv_timer_t *timer)
{
static int32_t count = -90;
lv_obj_t *scr = (lv_obj_t *) timer->user_data;
// Play arc animation
if (count < 90) {
lv_coord_t arc_start = count > 0 ? (1 - cosf(count / 180.0f * PI)) * 270 : 0;
lv_coord_t arc_len = (sinf(count / 180.0f * PI) + 1) * 135;
for (size_t i = 0; i < sizeof(arc) / sizeof(arc[0]); i++) {
lv_arc_set_bg_angles(arc[i], arc_start, arc_len);
lv_arc_set_rotation(arc[i], (count + 120 * (i + 1)) % 360);
}
}
// Delete arcs when animation finished
if (count == 90) {
for (size_t i = 0; i < sizeof(arc) / sizeof(arc[0]); i++) {
lv_obj_del(arc[i]);
}
// Create new image and make it transparent
img_text = lv_img_create(scr);
lv_img_set_src(img_text, &esp_text);
lv_obj_set_style_img_opa(img_text, 0, 0);
}
// Move images when arc animation finished
if ((count >= 100) && (count <= 180)) {
lv_coord_t offset = (sinf((count - 140) * 2.25f / 90.0f) + 1) * 20.0f;
lv_obj_align((lv_obj_t *) timer->user_data, LV_ALIGN_CENTER, 0, -offset);
lv_obj_align(img_text, LV_ALIGN_CENTER, 0, 2 * offset);
lv_obj_set_style_img_opa(img_text, offset / 40.0f * 255, 0);
}
// Delete timer when all animation finished
if (++count >= 180) {
lv_timer_del(timer);
}
}
void example_lvgl_demo_ui(lv_obj_t *scr)
{
// Create image
img_logo = lv_img_create(scr);
lv_img_set_src(img_logo, &esp_logo);
lv_obj_center(img_logo);
// Create arcs
for (size_t i = 0; i < sizeof(arc) / sizeof(arc[0]); i++) {
arc[i] = lv_arc_create(scr);
// Set arc caption
lv_obj_set_size(arc[i], 220 - 30 * i, 220 - 30 * i);
lv_arc_set_bg_angles(arc[i], 120 * i, 10 + 120 * i);
lv_arc_set_value(arc[i], 0);
// Set arc style
lv_obj_remove_style(arc[i], NULL, LV_PART_KNOB);
lv_obj_set_style_arc_width(arc[i], 10, 0);
lv_obj_set_style_arc_color(arc[i], arc_color[i], 0);
// Make arc center
lv_obj_center(arc[i]);
}
// Create timer for animation
lv_timer_create(anim_timer_cb, 20, (void *) scr);
}