|
#include "ui.h"
#include "w25x40.h"
#define IMAGE_WIDTH 200 // 图像宽度
#define IMAGE_HEIGHT 200 // 图像高度
#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT * 3) // 总图像大小 (200 * 200 * 3 字节)
#define CHUNK_HEIGHT 100 // 每次读取 100 行
#define CHUNK_SIZE (IMAGE_WIDTH * CHUNK_HEIGHT * LV_IMG_PX_SIZE_ALPHA_BYTE) // 每次读取的大小
#define IMAGE_ADDRESS 0x000004 // 外部Flash中图像的存储地址 (根据实际存储地址调整)
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_FRAME
#define LV_ATTRIBUTE_IMG_FRAME
#endif
LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_FRAME uint8_t Frame_map[IMAGE_WIDTH * CHUNK_HEIGHT*LV_IMG_PX_SIZE_ALPHA_BYTE];
lv_img_dsc_t Frame = {
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = IMAGE_WIDTH,
.header.h = CHUNK_HEIGHT, // 每次显示一部分
.data_size = CHUNK_SIZE, // 每块数据大小
.data = Frame_map, // 当前块的数据
};
uint32_t offset;
void ui_Logo_screen_init(void)
{
// 创建一个屏幕对象
ui_Logo = lv_obj_create(NULL);
lv_obj_clear_flag(ui_Logo, LV_OBJ_FLAG_SCROLLABLE); // 清除滚动标志
lv_obj_set_style_radius(ui_Logo, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(ui_Logo, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(ui_Logo, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
// 读取并显示每个图像块
for (int i = 0; i < IMAGE_WIDTH/CHUNK_HEIGHT; i++)
{
// 计算每次读取的地址偏移
offset = IMAGE_ADDRESS + (i * IMAGE_WIDTH * CHUNK_HEIGHT * LV_IMG_PX_SIZE_ALPHA_BYTE);
// 从 Flash 读取当前块的数据
SPI_FLASH_BufferRead(Frame_map, offset, CHUNK_SIZE);
//创建新的图像对象并显示每个图像块
ui_LenovoLogo = lv_img_create(ui_Logo);
lv_img_set_src(ui_LenovoLogo, &Frame);
lv_obj_set_width(ui_LenovoLogo, IMAGE_WIDTH); // 设置图像宽度
lv_obj_set_height(ui_LenovoLogo, CHUNK_HEIGHT); // 设置每块显示的高度
lv_obj_set_align(ui_LenovoLogo, LV_ALIGN_TOP_MID); // 每块图像居中对齐
//在Y轴上设置当前块的显示位置
lv_obj_set_y(ui_LenovoLogo, i * CHUNK_HEIGHT); // 设置垂直位置
lv_obj_clear_flag(ui_LenovoLogo, LV_OBJ_FLAG_HIDDEN); // 确保图像显示
lv_obj_set_style_opa(ui_LenovoLogo, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
}
}
|
|