mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
100 lines
2.9 KiB
C
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);
|
|
}
|