OpenEdv-开源电子网

 找回密码
 立即注册
查看: 2939|回复: 0

推荐一种LVGL图标管理代码

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2021-9-13 09:57:03 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2021-11-1 10:35 编辑

以下文章摘自微信公众号——开源电子网《推荐一种LVGL图标管理代码》
更多技术文章,请扫下方二维码关注

开源电子网,扫码2222222.png





一种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.jpg




  如果2.8寸横屏呢,那么显示屏该怎么样显示,320/64= 5 ,为啥一行等于4呢,主要就是图标之间有间隔,所以不足以容纳5个图标(除非不设置间隔),如下图所示:



1.jpg


  其他尺寸的显示屏由上述类推。

  为了解决这个问题,我们必须利用一下LVGL的返回函数的API了,例如获取显示屏宽度,以及把图标放到数组里面去,如以下分析:


1.声明图片(LVGL必须操作的)

  1. LV_IMG_DECLARE(Calculator)

  2. LV_IMG_DECLARE(X2)

  3. LV_IMG_DECLARE(X3)

  4. LV_IMG_DECLARE(X4)

  5. LV_IMG_DECLARE(X5)

  6. LV_IMG_DECLARE(X6)

  7. LV_IMG_DECLARE(X7)

  8. LV_IMG_DECLARE(X8)

  9. LV_IMG_DECLARE(X9)

  10. LV_IMG_DECLARE(X10)

  11. LV_IMG_DECLARE(X11)
复制代码


2.创建一个结构体获取图标信息的



  1. typedef struct

  2. {

  3.     char* xxx;

  4.     char* xxx1;

  5.     const void* app_image;  /* 图片源 */

  6. }app_image_info;



  7. static const app_image_info app_image[] =

  8. {

  9.     {" "," ",NULL},

  10.     {"Calculator","计算器",&Calculator},

  11.     {"X1","x",&X1},

  12.     {" X ","x",&X2},

  13.     {" X ","x",&X3},

  14.     {" X ","x",&X4},

  15.     {" X ","x",&X5},

  16.     {" X ","x",&X6},

  17.     {" X ","x",&X7},

  18.     {" X ","x",&X8},

  19.     {" X ","x",&X9},

  20.     {" X ","x",&X10},

  21.     {" X ","x",&X11},

  22. };
复制代码


3.获取图标的个数(12) + 一个NULL的等于13


  1. /* 获取路径的个数 */

  2. #define image_mun (int)(sizeof(app_image)/sizeof(app_image[0]))
复制代码

4.创建一个数组

该数组的大小等image_mun

  1. /* 设置一个app图像数组 */

  2. lv_obj_t *lv_app_t[image_mun];
复制代码

5.实现代码

  1. void lv_mid_cont_add_app(lv_obj_t *parent)

  2. {

  3.    lv_width_x 获取一个图标的宽度和大小 */

  4.     unsigned int lv_width_x = Calculator.header.w +10;

  5.     int app_index = 1;                 

  6.     /* 设置图标的索引为1 */

  7.     int line_feed_num = 0;            

  8.     /* 设置行数,图标的行数为0 */

  9.     int i = 0;

  10.     lv_app_t[0] = NULL;               

  11.     /* 图标数组索引0为NULL */

  12.     /* 图标数组索引1放第一个图标 */

  13.     lv_app_t[app_index] = lv_imgbtn_create(parent);   

  14. lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_RELEASED,

  15.                      NULL,app_image[app_index].app_image,NULL);

  16. lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_PRESSED,

  17.                      NULL,app_image[app_index].app_image,NULL);

  18. lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_CHECKED_RELEASED,

  19.                      NULL,app_image[app_index].app_image,NULL);

  20. lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_CHECKED_PRESSED,

  21.                     NULL,app_image[app_index].app_image,NULL);

  22.     lv_obj_align_to(lv_app_t[app_index], NULL, LV_ALIGN_TOP_LEFT, 10, 10);

  23.   

  24.     for (app_index = 2;app_index < image_mun;app_index ++) /* 遍历 */

  25. {   

  26. /* lv_app_t[app_index] = 创建图片按键 */

  27.         lv_app_t[app_index] = lv_imgbtn_create(parent);   

  28.         lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_RELEASED,

  29.                            NULL,app_image[app_index].app_image,NULL);

  30.         lv_imgbtn_set_src(lv_app_t[app_index], LV_IMGBTN_STATE_PRESSED,

  31.                              NULL,app_image[app_index].app_image,NULL);

  32.         lv_imgbtn_set_src(lv_app_t[app_index],

  33.                              LV_IMGBTN_STATE_CHECKED_RELEASED,

  34. NULL,app_image[app_index].app_image,NULL);

  35.         lv_imgbtn_set_src(lv_app_t[app_index],

  36.                              LV_IMGBTN_STATE_CHECKED_PRESSED,

  37.                              NULL,app_image[app_index].app_image,NULL);

  38. /* lv_width_x  = lv_width_x*2 + 10 */

  39.         lv_width_x = lv_width_x*2 + 10;

  40.         /* lv_width_x 小于父类的宽度就是显示屏的宽度 */

  41.         if (lv_width_x < lv_obj_get_width(parent))  

  42.         {

  43.             /* 如果lv_width_x小于显示屏的宽度,

  44. 那么后面的图片案件与它前面的图片按键右边中间对齐 */

  45.             lv_obj_align_to(lv_app_t[app_index], lv_app_t[app_index - 1],

  46.                                LV_ALIGN_OUT_RIGHT_MID, 10, 0);

  47.         }

  48.         else/* 如果lv_width_x大于显示屏的宽度 */

  49.         {

  50.             /* 行数加1 */

  51.             line_feed_num ++;

  52.             /* 设置这个图片按键的位置为第一行第一个 */

  53.             lv_obj_set_pos(lv_app_t[app_index],10,

  54. Calculator.header.w*line_feed_num + 30 + i*20);

  55.             i ++;

  56.             /* lv_width_x = 图片宽度 */

  57.             lv_width_x = Calculator.header.w;

  58.         }

  59.     }

  60. }
复制代码

    上面的代码就可以实现我们的功能了,具体就不分析了,可以使用多种显示屏试试,都是一样的效果。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表