超级版主
- 积分
- 4667
- 金钱
- 4667
- 注册时间
- 2019-5-8
- 在线时间
- 1224 小时
|
本帖最后由 正点原子运营 于 2021-11-1 10:35 编辑
以下文章摘自微信公众号——开源电子网《推荐一种LVGL图标管理代码》
更多技术文章,请扫下方二维码关注
一种LVGL图标管理代码
如果我们使用LVGL制作一个类似手机上的APP界面,那么我们怎么管理图标呢,我们知道LVGL可以设置对象的位置,可以对齐等等操作,如果我们使用对象设置坐标的方法:可能必须先知道显示屏的大小才可以,当然我们也不知道APP的数量多少,一个显示屏的宽度到底放多个图标等等问题,有没有一种自动判断方法呢,让图表按照我们的思路排版。
例如兼容显示屏(2.8/3.5/4.3/7/10.1)寸显示屏,显示屏宽度越大那么一行容纳的图标就越多,如果显示屏宽度越小,那么兼容图标就越少,例如5个图标,每个图标的宽度是64,那么对于2.8竖屏(240*320)一行可以容纳240/64= 3.75也就是说3个图标,剩下的两个可以在第二行显示,如下图所示:
如果2.8寸横屏呢,那么显示屏该怎么样显示,320/64= 5 ,为啥一行等于4呢,主要就是图标之间有间隔,所以不足以容纳5个图标(除非不设置间隔),如下图所示:
其他尺寸的显示屏由上述类推。
为了解决这个问题,我们必须利用一下LVGL的返回函数的API了,例如获取显示屏宽度,以及把图标放到数组里面去,如以下分析:
1.声明图片(LVGL必须操作的)
- LV_IMG_DECLARE(Calculator)
- LV_IMG_DECLARE(X2)
- LV_IMG_DECLARE(X3)
- LV_IMG_DECLARE(X4)
- LV_IMG_DECLARE(X5)
- LV_IMG_DECLARE(X6)
- LV_IMG_DECLARE(X7)
- LV_IMG_DECLARE(X8)
- LV_IMG_DECLARE(X9)
- LV_IMG_DECLARE(X10)
- LV_IMG_DECLARE(X11)
复制代码
2.创建一个结构体获取图标信息的
- typedef struct
- {
- char* xxx;
- char* xxx1;
- const void* app_image; /* 图片源 */
- }app_image_info;
-
- static const app_image_info app_image[] =
- {
- {" "," ",NULL},
- {"Calculator","计算器",&Calculator},
- {"X1","x",&X1},
- {" X ","x",&X2},
- {" X ","x",&X3},
- {" X ","x",&X4},
- {" X ","x",&X5},
- {" X ","x",&X6},
- {" X ","x",&X7},
- {" X ","x",&X8},
- {" X ","x",&X9},
- {" X ","x",&X10},
- {" X ","x",&X11},
- };
复制代码
3.获取图标的个数(12) + 一个NULL的等于13
- /* 获取路径的个数 */
- #define image_mun (int)(sizeof(app_image)/sizeof(app_image[0]))
复制代码
4.创建一个数组
该数组的大小等image_mun
- /* 设置一个app图像数组 */
- lv_obj_t *lv_app_t[image_mun];
复制代码
5.实现代码
- void lv_mid_cont_add_app(lv_obj_t *parent)
- {
- lv_width_x 获取一个图标的宽度和大小 */
- unsigned int lv_width_x = Calculator.header.w +10;
- int app_index = 1;
- /* 设置图标的索引为1 */
- int line_feed_num = 0;
- /* 设置行数,图标的行数为0 */
- int i = 0;
- lv_app_t[0] = NULL;
- /* 图标数组索引0为NULL */
- /* 图标数组索引1放第一个图标 */
- lv_app_t[app_index] = lv_imgbtn_create(parent);
- lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_RELEASED,
- NULL,app_image[app_index].app_image,NULL);
- lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_PRESSED,
- NULL,app_image[app_index].app_image,NULL);
- lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_CHECKED_RELEASED,
- NULL,app_image[app_index].app_image,NULL);
- lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_CHECKED_PRESSED,
- NULL,app_image[app_index].app_image,NULL);
- lv_obj_align_to(lv_app_t[app_index], NULL, LV_ALIGN_TOP_LEFT, 10, 10);
-
- for (app_index = 2;app_index < image_mun;app_index ++) /* 遍历 */
- {
- /* lv_app_t[app_index] = 创建图片按键 */
- lv_app_t[app_index] = lv_imgbtn_create(parent);
- lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_RELEASED,
- NULL,app_image[app_index].app_image,NULL);
- lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_PRESSED,
- NULL,app_image[app_index].app_image,NULL);
- lv_imgbtn_set_src(lv_app_t[app_index],
- LV_IMGBTN_STATE_CHECKED_RELEASED,
- NULL,app_image[app_index].app_image,NULL);
- lv_imgbtn_set_src(lv_app_t[app_index],
- LV_IMGBTN_STATE_CHECKED_PRESSED,
- NULL,app_image[app_index].app_image,NULL);
- /* lv_width_x = lv_width_x*2 + 10 */
- lv_width_x = lv_width_x*2 + 10;
- /* lv_width_x 小于父类的宽度就是显示屏的宽度 */
- if (lv_width_x < lv_obj_get_width(parent))
- {
- /* 如果lv_width_x小于显示屏的宽度,
- 那么后面的图片案件与它前面的图片按键右边中间对齐 */
- lv_obj_align_to(lv_app_t[app_index], lv_app_t[app_index - 1],
- LV_ALIGN_OUT_RIGHT_MID, 10, 0);
- }
- else/* 如果lv_width_x大于显示屏的宽度 */
- {
- /* 行数加1 */
- line_feed_num ++;
- /* 设置这个图片按键的位置为第一行第一个 */
- lv_obj_set_pos(lv_app_t[app_index],10,
- Calculator.header.w*line_feed_num + 30 + i*20);
- i ++;
- /* lv_width_x = 图片宽度 */
- lv_width_x = Calculator.header.w;
- }
- }
- }
复制代码
上面的代码就可以实现我们的功能了,具体就不分析了,可以使用多种显示屏试试,都是一样的效果。
|
|