#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
static const char * getenv_default(const char * name, const char * dflt)
{
return getenv(name) ?: dflt;
}
#if LV_USE_LINUX_FBDEV
static void lv_linux_disp_init(void)
{
const char * device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0");
lv_display_t * disp = lv_linux_fbdev_create();
lv_linux_fbdev_set_file(disp, device);
}
#elif LV_USE_LINUX_DRM
static void lv_linux_disp_init(void)
{
const char * device = getenv_default("LV_LINUX_DRM_CARD", "/dev/dri/card0");
lv_display_t * disp = lv_linux_drm_create();
lv_linux_drm_set_file(disp, device, -1);
}
#elif LV_USE_SDL//当前使用的是SDL框架
static void lv_linux_disp_init(void)
{
const int width = atoi(getenv("LV_SDL_VIDEO_WIDTH") ?: "800");
const int height = atoi(getenv("LV_SDL_VIDEO_HEIGHT") ?: "480");
lv_sdl_window_create(width, height);
}
#else
#error Unsupported configuration
#endif
/*
//按钮点击事件处理函数
void btn_event(lv_event_t * e)
{
printf("button clicked\n");
}
*/
lv_obj_t * label;//把标签定义为全局变量,让所有函数都可以访问
lv_obj_t * img;//把图片定义为全局变量,让所有函数都可以访问
/*
//定义一个颜色数组
static lv_color_t colors[10] = {0};//10种颜色
int color_index = 0;//颜色索引
void btn_event_1(lv_event_t * e)
{
printf("prev button clicked\n");
color_index++;
if(color_index > 10)//防止越界
{
color_index = 0;
}
lv_obj_set_style_text_color(label, arry[color_index], 0);
}
void btn_event_2(lv_event_t * e)
{
printf("next button clicked\n");
color_index++;
if(color_index > 10)//防止越界
{
color_index = 0;
}
lv_obj_set_style_text_color(label, arry[color_index], 0);
}
//初始化用户的UI界面
void init_ui(void)
{
//初始化颜色数组
arry[0] = lv_color_make(255, 0, 0);
arry[1] = lv_color_make(0, 255, 0);
arry[2] = lv_color_make(0, 0, 255);
arry[3] = lv_color_make(255, 255, 0);
arry[4] = lv_color_make(255, 0, 255);
arry[5] = lv_color_make(0, 255, 255);
arry[6] = lv_color_make(255, 255, 255);
arry[7] = lv_color_make(0, 0, 0);
arry[8] = lv_color_make(128, 128, 128);
arry[9] = lv_color_make(64, 64, 64);
//创建一个标签
lv_obj_t * label = lv_label_create(lv_scr_act());
//标签居中显示
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
//设置标签的字体大小
lv_obj_set_style_text_font(label, &lv_font_montserrat_16, 0);
//设置标签的文本内容
lv_label_set_text(label, "Hello, LVGL!");
//设置两个按钮
lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
//设置按钮的大小
lv_obj_set_size(btn1, 100, 50);
lv_obj_set_size(btn2, 100, 50);
//设置按钮的位置
lv_obj_align(btn1, LV_ALIGN_CENTER, -100, 50);
lv_obj_align(btn2, LV_ALIGN_CENTER, 100, 50);
//创建两个标签在按钮上
lv_obj_t * label1 = lv_label_create(btn1);
lv_obj_t * label2 = lv_label_create(btn2);
//设置标签的文本内容
lv_label_set_text(label1, "prev");
lv_label_set_text(label2, "next");
//设置标签在按钮居中
lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
lv_obj_align(label2, LV_ALIGN_CENTER, 0, 0);
//给按钮事件函数
lv_obj_add_event_cb(btn1, btn_event_1, LV_EVENT_CLICKED, NULL);
lv_obj_add_event_cb(btn2, btn_event_2, LV_EVENT_CLICKED, NULL);
}
*/
/*
//实现按钮切换图片的例
//初始化用户的UI界面
// 全局图片对象和索引
int current_img_index = 0; // 当前图片索引
const char *img_list[] = { // 图片路径列表
"A:./pic/1.bmp",
"A:./pic/2.bmp",
// 根据实际图片数量扩展
};
int img_count = sizeof(img_list) / sizeof(img_list[0]); // 图片总数
//图片事件
//制作一个图片浏览器,点击按钮实现图片上下切换
// prev按钮:切换到上一张图片(循环)
void btn_event_1(lv_event_t *e) {
current_img_index = (current_img_index - 1 + img_count) % img_count;
lv_image_set_src(img, img_list[current_img_index]); // 更新图片
printf("prev button clicked, show image %d\n", current_img_index + 1);
}
// next按钮:切换到下一张图片(循环)
void btn_event_2(lv_event_t *e) {
current_img_index = (current_img_index + 1) % img_count;
lv_image_set_src(img, img_list[current_img_index]); // 更新图片
printf("next button clicked, show image %d\n", current_img_index + 1);
}
void init_ui(void)
{
img = lv_image_create(lv_screen_active()); // 赋值给全局变量
lv_image_set_src(img, img_list[current_img_index]); // 初始显示第一张
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
//设置两个按钮
lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
//设置按钮的大小
lv_obj_set_size(btn1, 100, 50);
lv_obj_set_size(btn2, 100, 50);
//设置按钮的位置
lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 10, 10);
lv_obj_align(btn2, LV_ALIGN_BOTTOM_RIGHT, -10, 10);
//创建两个标签在按钮上
lv_obj_t * label1 = lv_label_create(btn1);
lv_obj_t * label2 = lv_label_create(btn2);
//设置标签的文本内容
lv_label_set_text(label1, "prev");
lv_label_set_text(label2, "next");
//设置标签在按钮居中
lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
lv_obj_align(label2, LV_ALIGN_CENTER, 0, 0);
//给按钮事件函数
lv_obj_add_event_cb(btn1, btn_event_1, LV_EVENT_CLICKED, NULL);
lv_obj_add_event_cb(btn2, btn_event_2, LV_EVENT_CLICKED, NULL);
}
*/
// 电脑本地图片路径(替换为实际图片文件名)
#define LOGIN_IMG_PATH "A:E:/Users/ASUS/Pictures/5.bmp" // 登录提示图
#define REGISTER_IMG_PATH "A:E:/Users/ASUS/Pictures/4.bmp" // 注册提示图
static void create_auto_del_img(const char *img_path) {
// 创建图片对象
lv_obj_t *tips_img = lv_img_create(lv_scr_act());
// 设置图片源(直接使用电脑本地路径)
lv_img_set_src(tips_img, img_path);
// 图片居中显示
lv_obj_align(tips_img, LV_ALIGN_CENTER, 0, 0);
// 调整图片大小(根据实际图片尺寸,这里以300x200为例)
lv_obj_set_size(tips_img, 300, 200);
// 3秒后自动删除图片
lv_timer_create(
[](lv_timer_t *timer) {
lv_obj_del(timer->user_data); // 删除图片
lv_timer_del(timer); // 删除定时器
},
3000, // 3000ms = 3秒
tips_img
);
}
static void login_btn_event(lv_event_t *e) {
printf("登录按钮点击,显示图片:%s\n", LOGIN_IMG_PATH);
create_auto_del_img(LOGIN_IMG_PATH);
}
// 注册按钮点击:显示4.bmp
static void register_btn_event(lv_event_t *e) {
printf("注册按钮点击,显示图片:%s\n", REGISTER_IMG_PATH);
create_auto_del_img(REGISTER_IMG_PATH);
}
//键盘例子
static void ta_event_cb(lv_event_t * e)
{
//获取事件号
lv_event_code_t code = lv_event_get_code(e);
//获取触发事件的对象
lv_obj_t * ta = lv_event_get_target(e);
//获取键盘对象
lv_obj_t * kb = lv_event_get_user_data(e);
if(code == LV_EVENT_FOCUSED) //判断焦点是否进入
{
lv_keyboard_set_textarea(kb, ta);//把键盘设置到对应的输入框
lv_obj_remove_flag(kb, LV_OBJ_FLAG_HIDDEN);//显示键盘
}
if(code == LV_EVENT_DEFOCUSED) //判断是否焦点离开
{
lv_keyboard_set_textarea(kb, NULL);//把键盘离开输入框
lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);//隐藏键盘
}
}
void my_keyboard(void)
{
/*Create a keyboard to use it with an of the text areas*/
lv_obj_t * kb = lv_keyboard_create(lv_screen_active());//创建键盘对象
/*Create a text area. The keyboard will write here*/
lv_obj_t * ta1;
ta1 = lv_textarea_create(lv_screen_active());//创建文本输入框
lv_obj_align(ta1, LV_ALIGN_CENTER,0, -100);//设置输入框的位置
lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);//添加文本输入框的事件,传递键盘对象
lv_textarea_set_placeholder_text(ta1, "Hello");//设置文本输入框的提示信息
//lv_obj_set_size(ta1, 140, 30);//设置文本输入框的大小
lv_textarea_set_one_line(ta1, true);//设置文本输入框为单行
lv_obj_t * ta2;
ta2 = lv_textarea_create(lv_screen_active());
lv_obj_align(ta2, LV_ALIGN_CENTER, 0, -50);
lv_obj_add_event_cb(ta2, ta_event_cb, LV_EVENT_ALL, kb);
//lv_obj_set_size(ta2, 140, 30);
lv_textarea_set_one_line(ta2, true);//设置文本输入框为单行
lv_obj_add_event_cb(ta2, ta_event_cb, LV_EVENT_ALL, kb);//添加第二个文本输入框的事件,传递键盘对象
lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);//添加文本输入框的事件,传递键盘对象
//创建一个登录按钮
lv_obj_t *btn = lv_btn_create(lv_screen_active());
lv_obj_align_to(btn, ta2,LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
lv_obj_t *label = lv_label_create(btn);
lv_label_set_text(label, "loin");
//创建一个注册按钮
lv_obj_t *btn2 = lv_btn_create(lv_screen_active());
lv_obj_align_to(btn2, ta2,LV_ALIGN_OUT_BOTTOM_RIGHT, -60, 0);
lv_obj_t *label2 = lv_label_create(btn2);
lv_label_set_text(label2, "register");
//给按钮事件函数
lv_obj_add_event_cb(btn, btn_event_1, LV_EVENT_CLICKED, NULL);
lv_obj_add_event_cb(btn2, btn_event_2, LV_EVENT_CLICKED, NULL);
}
int main(void)
{
lv_init();//初始化LVGL库
/*Linux display device init*/
lv_linux_disp_init();//Linux显示设备初始化
#if LV_USE_SDL
printf("init input\n"); //初始化输入设备
//init input device
lv_sdl_mouse_create(); //初始化鼠标
lv_sdl_keyboard_create(); //初始化键盘
lv_sdl_mousewheel_create(); //初始化鼠标滚轮
printf("init input end\n");
#endif
/*Create a Demo*/ //创建一个Demo(例子)
// lv_example_button_1();
// lv_demo_widgets();
// lv_demo_widgets_start_slideshow();
//lv_example_ime_pinyin_2();
/*Handle LVGL tasks*/
//在屏幕中创建一个对象
//例子:设置一个对象的位置与大小
//Create a Demo 创建例子
/*lv_obj_t *obj = lv_obj_create(lv_screen_active()); // 在当前显示器中创建一个对象
lv_obj_set_size(obj, 100, 100);// 设置对象的大小
lv_obj_align(obj,LV_ALIGN_CENTER,0,0);
//lv_obj_set_pos(obj, 350, 190);// 设置对象的位置
//void lv_obj_set_align(obj, LV_ALIGN_TOP_LEFT,) //快速设置当前对象的位置
//lv_obj_align(obj,LV_ALIGN_BOTTOM_RIGHT,-30,-30); //快速设置当前对象的位置,且可以设置偏移量
lv_obj_t *obj1 = lv_obj_create(lv_screen_active()); // 在当前显示器中创建一个对象
lv_obj_set_size(obj1, 100, 100);// 设置对象的大小
lv_obj_align_to(obj1,obj,LV_ALIGN_OUT_BOTTOM_RIGHT,-100,0);
*/
/*Create a Demo 创建例子*/
/* lv_obj_t *obj = lv_obj_create(lv_screen_active()); // 在当前显示器中创建一个对象
// 设置对象的大小
lv_obj_set_size(obj, 300, 300);
// 设置大对象的位置
lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0);
// 在obj对象上再创建一个对象
lv_obj_t *obj1 = lv_obj_create(obj);
lv_obj_set_size(obj1, 60, 60);
lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0);
lv_obj_t *obj2 = lv_obj_create(obj);
lv_obj_set_size(obj2, 60, 60);
lv_obj_align_to(obj2, obj1, LV_ALIGN_OUT_LEFT_MID,-40, 0);
lv_obj_t *obj3 = lv_obj_create(obj);
lv_obj_set_size(obj3, 60, 60);
lv_obj_align_to(obj3, obj1, LV_ALIGN_OUT_RIGHT_MID,40, 0);
lv_obj_t *obj4 = lv_obj_create(obj);
lv_obj_set_size(obj4, 60, 60);
lv_obj_align_to(obj4, obj1, LV_ALIGN_OUT_TOP_MID,0, -40);
lv_obj_t *obj5 = lv_obj_create(obj);
lv_obj_set_size(obj5, 60, 60);
lv_obj_align_to(obj5, obj1, LV_ALIGN_OUT_BOTTOM_MID,0, 40);
lv_obj_t *obj6 = lv_obj_create(obj);
lv_obj_set_size(obj6, 60, 60);
lv_obj_align_to(obj6, obj4, LV_ALIGN_OUT_LEFT_MID,-40, 0);
lv_obj_t *obj7 = lv_obj_create(obj);
lv_obj_set_size(obj7, 60, 60);
lv_obj_align_to(obj7, obj4, LV_ALIGN_OUT_RIGHT_MID,40, 0);
lv_obj_t *obj8 = lv_obj_create(obj);
lv_obj_set_size(obj8, 60, 60);
lv_obj_align_to(obj8, obj5, LV_ALIGN_OUT_LEFT_MID,-40, 0);
lv_obj_t *obj9 = lv_obj_create(obj);
lv_obj_set_size(obj9, 60, 60);
lv_obj_align_to(obj9, obj5, LV_ALIGN_OUT_RIGHT_MID,40, 0);
*/
/*
//创建一个标签对象
lv_obj_t *name = lv_label_create(lv_screen_active());
lv_label_set_text(name,"zhangsiman");
lv_obj_align(name,LV_ALIGN_CENTER,0,0);
lv_obj_t *class = lv_label_create(lv_screen_active());
lv_label_set_text(class,"wulian4221");
lv_obj_align(class,LV_ALIGN_CENTER,0,30);
lv_obj_t *xuehao = lv_label_create(lv_screen_active());
lv_label_set_text_fmt(xuehao,"202244021131");
lv_obj_align(xuehao,LV_ALIGN_CENTER,0,60);
*/
/*
lv_obj_t *xuehao = lv_label_create(lv_screen_active());
lv_label_set_text_fmt(xuehao,"202244021131");
lv_obj_align(xuehao,LV_ALIGN_CENTER,0,0);
lv_obj_set_style_text_font(xuehao,&lv_font_montserrat_24,0);
lv_obj_set_style_text_color(xuehao, lv_color_make(255,0,0),0);
*/
/* 按钮事件
lv_obj_t *btn = lv_btn_create(lv_screen_active());
lv_obj_set_size(btn, 100, 50);
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
lv_obj_t *label = lv_label_create(btn);
lv_label_set_text(label, "Click me");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(btn, btn_event, LV_EVENT_CLICKED, NULL);
*/
/*
//图片例子
lv_obj_t *img = lv_image_create(lv_screen_active());
//设置图片路径名
//lv_img_set_src(img, "E:\\Users\\ASUS\\1.bmp");
lv_image_set_src(img, "A:./pic/1.bmp");
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
*/
/*实现按钮切换图片的例子
init_ui();
*/
/*触摸屏按钮事件
#if LV_USE_LINUX_FBDEV
//创建触摸屏驱动设备
lv_indev_t *touch = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event0");
//校准触摸屏坐标
lv_evdev_set_calibration(touch, 0, 0, 1024, 600);//黑色边框的屏幕
#endif
//创建一个按钮
lv_obj_t *btn = lv_button_create(lv_screen_active());
//设置按钮的大小
lv_obj_set_size(btn, 100, 50);
//居中显示按钮
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
//添加按钮的事件函数
lv_obj_add_event_cb(btn, btn_event, LV_EVENT_CLICKED, NULL);
*/
my_keyboard();
while(1) {
lv_timer_handler();
usleep(5000);
}
return 0;
}