木子剑
生命不熄,学习不止!

在21年6月1日,LVGL v8.0.0发布了,我第一时间就下载移植过来了。移植方法和之前一样就是lv_port_disp.c文件的实现

在网上的关于label介绍,大部份都是轻聊淡写,一点也不够深入,我们知道lv_label.h和lv_label.c是主要源文件。

先看看lv_label.h头文件有多少功能函数:

/*-********************
 * GLOBAL PROTOTYPES 函数原型
 **********************/
lv_obj_t * lv_label_create(lv_obj_t * parent);

void lv_label_set_text(lv_obj_t * obj, const char * text);
void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...);
void lv_label_set_text_static(lv_obj_t * obj, const char * text);
void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode);
void lv_label_set_recolor(lv_obj_t * obj, bool en);
void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index);
void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index);

char * lv_label_get_text(const lv_obj_t * obj);
lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj);
bool lv_label_get_recolor(const lv_obj_t * obj);
void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos);
uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in);
bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos);
t32_t lv_label_get_text_selection_start(const lv_obj_t * obj);
uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj);
void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt); void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt);

对于以上的函数的功能及使用方法,应当深入的认识和解释,才能将label应用得活灵活现,得心应手。

 

在LVGL中有浓厚的对像概念,比如lv_obj_t * lv_label_create(lv_obj_t * parent); 就是创建一个obj对像,

这个对像是label,什么是label,其实就是TXT文本。

我们如何对label进行着色呢?如下所示

    lv_obj_t * label2 = lv_label_create(lv_scr_act());
    lv_label_set_recolor(label2, true); 
    lv_label_set_text(label2, "#f000f0 LVGL is an open project and contribution is very welcome# ");

我们先用set_recolor打开重新着色功能,然后再利用#f000f0 txt#进行设定颜色,以#开始后面就是XX XX XX颜色,

XX XX XX是什么意思呢?它就是RGB565,第1个字节XX是红,第2个字节XX是绿,第3个字节XX是蓝。然后打一空格,

紧接着就是TXT文本了,直到再一次出现#,着色结束。如果你想像printf一样换行,加一个\n就行了,这个太熟悉了吧?

 

好了,已经讲解了lv_label_create(),lv_label_set_recolor(),lv_label_set_text()这3个label功能函数了,

还差15个label没讲解。未完结,继续。。。。。。

 

时间:2021-06-05

在label文本中,是要排列的,排列会使用到俩个函数,如下所示:

1     lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_AUTO, 0);  
2     lv_obj_align(label1, LV_ALIGN_TOP_LEFT, 5, 0);   
lv_obj_align()是所有对象的通用函数,lv_obj_set_style_text_align是text用的,那么都是align排列属性,它们有
什么区别呢?来打一个形象的比喻,我们把屏整块面板比作一张A4纸,这个A4就是参照物。我要在A4纸写一段文字,哪这些文字
写在哪里呢?当然人手可以随意写都行,写在屏的上方、下方、中间都是没问题的,但LGVL是机器代码,我们要给它指定地方才能执行,这个
就是lv_obj_align()起作用了。假设在屏下方写一串文本,但是问题又来了,虽然我知道是屏下方写,但是这文字是在屏下方的中间呢 左边呢?
还是右边呢,这个时候屏“下方”成为了参照物,换个讲法可能更直观,比如你在EXCL表格里打文本,是不是可以对文字进行对齐方式操作?不管你
怎么对齐,文字都是在这个小表格里面的,如果我们这样想就对了,这是日常工作最简单事情了,实现这操作是lv_obj_set_style_text_align()
这次没讲label相关,却把style其中一个讲了一下,不好意思!
还差xxx个label没讲解,拉回正题。未完结,继续。。。。。。

 

先看看label这三个函数:

1 void lv_label_set_text(lv_obj_t * obj, const char * text);
2 void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...);
3 void lv_label_set_text_static(lv_obj_t * obj, const char * text);

lv_label_set_text()过测试发现,它只是label输出文本的,和printf("44646")一样的,比较容易理解。
lv_label_set_text_fmt()它就是pintf("%d user", user_num)实现,它真正用法是这样:
lv_label_set_text_fmt(label1, "%d user", user_num);

怎么样不算很难吧??哈哈。。

 

这个lv_label_set_text_static()不是很好理解,没有找到好的方法证明它,但官方是这样描述的:

Set a static text. It will not be saved by the label so the 'text' variable
设置静态文本。它不会被标签保存,因此“text”变量

我们就当一个变量,加static进行修饰,先这样简单的认为是放在ROM吧,这可能不是作者的本意。

 

这个lv_label_set_long_mode()函数,为了搞明白它,我试验很多次了,有点理解MODE了

要使用long mode,要先在lv_conf.h文件里找到它们,并设置好:

#define LV_USE_LABEL        1
#if LV_USE_LABEL
#  define LV_LABEL_TEXT_SELECTION   1   /* 启用标签的选自文本*/
#  define LV_LABEL_LONG_TXT_HINT    1   /* 在标签中存储一些额外的信息,以加快绘制很长的文本*/
#endif

 

在lv_label.h中,有它所有的long MODE,如下所示:

/*- 长模式行为. Used in 'lv_label_ext_t'*/
enum {// 枚举类型
    LV_LABEL_LONG_WRAP,             /*-<0 保持对象宽度,包裹过长的线条,并扩大物体高度*/
    LV_LABEL_LONG_DOT,              /*-<1 如果文本太长,在末尾写...,此处省略N多字*/
    LV_LABEL_LONG_SCROLL,           /*-<2 保持大小并左右来回滚动文本*/
    LV_LABEL_LONG_SCROLL_CIRCULAR,  /*-<3 保持大小并循环滚动文本,类似WRAP*/
    LV_LABEL_LONG_CLIP,             /*-<4 保持大小并剪下文本,多的文本不显示 不管它*/
};

基本上所有的我都试过了,总结出,如果真实文本超出了lv_obj_set_width(label2, 100)设定长度,LONG MODE

的设定就会发挥作用,我们设计一些滚动效果非常的简单,另外出现的lv_obj_set_width()对像通用的,

设置对象的宽度,就是占用屏上多少个像素点。这个不是难理解

 

时间:2021-06-6

void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index);
void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index);
void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt);
void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt);

上面这些在网上找不到任何例程,一直搞不清楚怎么使用,也不理解它。这个可能就是我们最不了解的地方了。

其他的GET功能函数的话,比较简单就不过多的解释了,因为我们都SET过一次了,GET基本是知道了。

 

 

如果我们要label输出中文,该如何操作呢?

首先在lv_conf.h进行配置好,如下所示:

#define LV_FONT_MONTSERRAT_14    0
#define LV_FONT_MONTSERRAT_16    1

/* 展示特殊功能 */
#define LV_FONT_MONTSERRAT_12_SUBPX      0
#define LV_FONT_MONTSERRAT_28_COMPRESSED 0  /* bpp = 3*/
#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0  /* 希伯来文、阿拉伯文、波斯文字母及其所有形式*/
#define LV_FONT_SIMSUN_16_CJK            1  /* 1000 个最常见的 CJK 部首, 这是中文开关了 */

/* 像素完美的等宽字体 */
#define LV_FONT_UNSCII_8        0
#define LV_FONT_UNSCII_16       1

/* Always set a default font 始终设置默认字体  */
#define LV_FONT_DEFAULT &lv_font_montserrat_16

xx_16相关的define都打开1,这是进时候LVGL会加载简体中文字库,但是会占用大量的FLASH空间。

然后我们找到例程去测试它,如下所示:

#if LV_FONT_SIMSUN_16_CJK
void lv_example_label_3(void)
{
    lv_obj_t * cz_label = lv_label_create(lv_scr_act());
    lv_label_set_text(cz_label, "嵌入式系统(Embedded System),\n是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。");
    lv_obj_set_style_text_font(cz_label, &lv_font_simsun_16_cjk, 0);
    lv_obj_set_width(cz_label, 310);
    lv_obj_align(cz_label, LV_ALIGN_BOTTOM_LEFT, 5, -5);
}

#endif

 

显示效果如下:

               上方这个中文,就是实际显示效果。还算不错吧?

 

posted on 2021-06-05 00:03  木子剑  阅读(1897)  评论(0编辑  收藏  举报