在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
显示效果如下:
上方这个中文,就是实际显示效果。还算不错吧?