ESP32 开发笔记(十二)LittlevGL 添加自定义字体和物理按键
LittlevGL 添加自定义字体
获取字库 ttf 文件
可以从一些网站上获取字库文件,比如
请注意字体许可证
生成源文件
使用 LittlevGL 提供的字库文件转换工具,将 ttf 字库文件转换为源文件。
将生成的源文件添加到 LittlevGL 工程中,添加以下代码声明字体:
extern lv_font_t my_font_name;
1
或者
LV_FONT_DECLARE(my_font_name);
1
源代码中使用这个字体可以:
style.text.font = &my_font_name;
1
或者将这个字体添加到当前使用的字体中:
lv_font_add(&my_font_name, ¤t_use);
1
例如:
LV_FONT_DECLARE(my_font_name);
void lv_chinese_fonts1(void)
{
/*Concatenate the fonts into one*/
// lv_font_add(&arial_cyrillic_20, &arial_ascii_20); 相同高度才可以添加到一起
// lv_font_add(&arial_math_20, &arial_ascii_20);
/* 创建一个新的样式,并且修改新样式的文本字体 */
static lv_style_t style1;
lv_style_copy(&style1, &lv_style_plain);
style1.text.font = &my_font_name; /* 设置自定义字体 */
/*Create a label and set new text*/
lv_obj_t * label = lv_label_create(lv_scr_act(), NULL); /* 创建标签 */
lv_obj_set_pos(label, 10, 10); /* 设置相对位置 */
lv_label_set_style(label, &style1); /* 设置样式 */
lv_label_set_text(label, "Hello World!\n 世界你好,我是littleVGL!"); /* 显示汉字 */
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LittlevGL 添加自定义符号
流程:
寻找合适的 ttf 文件(包含目标符号,可在 linux 下通过 FontForge 软件打开 ttf 文件,查看包含那些字符)
使用 LittlevGL 提供的字库文件转换工具,将选中的符号转换为 c 源文件。在转换的页面 Range 中输入目标符号的 Unicode 编码,怎么查询可以通过百度
将源文件添加到工程中,和上面添加字体类似,首先声明字体,然后添加到字体中或者直接使用。
定义一个宏指向这个目标符号,宏的内容需要为 UTF-8编码,通过 Unicode和UTF编码转换 可以进行转换
例如:
这样就需要在程序中:
/* MACROS */
#define SYMBOL_TEMP "\xE2\x84\x83" // E28483
/* STATIC VARIABLES */
LV_FONT_DECLARE(tempreture_symbol_40);
/* Add font to current font */
lv_font_add(&tempreture_symbol_40, &lv_font_dejavu_40);
/* Use this symbol */
lv_label_set_text(temp_l, "21.5 "SYMBOL_TEMP);
1
2
3
4
5
6
7
8
9
10
11
LittlevGL 添加物理按键
注册物理按键驱动:
uint8_t my_btn_read()
{
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
{
return 1;
}
else
{
return 0;
}
}
bool my_input_read(lv_indev_data_t *data)
{
static int8_t last_btn = 0; /* Store the last pressed button */
int8_t btn_pr = my_btn_read(); /* Get the ID (0,1,2...) of the pressed button */
if (btn_pr > 0)
{ /* Is there a button press? */
last_btn = btn_pr; /* Save the ID of the pressed button */
data->state = LV_INDEV_STATE_PR; /* Set the pressed state */
}
else
{
data->state = LV_INDEV_STATE_REL; /* Set the released state */
}
data->btn = last_btn; /* Set the last button */
return false; /* No buffering so no more data read */
}
void my_button_init(void)
{
static lv_indev_t *indev;
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.read = my_input_read;
indev_drv.type = LV_INDEV_TYPE_BUTTON;
indev = lv_indev_drv_register(&indev_drv);
/*points_array: these points will be assigned to the buttons to press a specific point on the screen.*/
static lv_point_t points_array[] = {{20, 20}};
lv_indev_set_button_points(indev, points_array);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
创建一个按键,保证上面的点在按钮的区域内:
static lv_obj_t *btn = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_size(btn, 40, 40);
lv_obj_set_pos(btn, 0, 0);
lv_btn_set_action(btn, LV_BTN_ACTION_CLICK, btn_click_action);
---------------------
ESP32 开发笔记(十二)LittlevGL 添加自定义字体和物理按键的更多相关文章
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- DirectX11笔记(十二)--Direct3D渲染8--EFFECTS
原文:DirectX11笔记(十二)--Direct3D渲染8--EFFECTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737 ...
- Java开发笔记(二十)一维数组的用法
之前介绍的各类变量都是单独声明的,倘若要求定义相同类型的一组变量,则需定义许多同类型的变量,显然耗时耗力且不宜维护.为此,编程语言引入了数组的概念,每个数组都由一组相同类型的数据构成,对外有统一的数组 ...
- Java开发笔记(二十四)方法的组成形式
经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...
- Java开发笔记(二十五)方法的输入参数
前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...
- Java开发笔记(二十六)方法的输出参数
前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...
- Java开发笔记(二十八)布尔包装类型
前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...
随机推荐
- 递归算法详细分析->C
C通过运行时堆栈支持递归函数的实现.递归函数就是直接或间接调用自身的函数. 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的<C语言程序设计> ...
- SSH框架之Struts(3)——Struts的执行流程之核心方法
上篇讲了Tomcat实例化一个单例的ActionServlet.依据web.xml配置文件做好对应的初始化工作. 这时client产生一个.do结尾的request请求,採用get/post方式提交之 ...
- 《从零開始学Swift》学习笔记(Day60)——Core Foundation框架
创文章,欢迎转载.转载请注明:关东升的博客 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.尽管在Swift中调用这样的C语 ...
- Effective C++ 45-48
45.弄清c++在幕后为你所写.所调用的函数. 假设设置一个空类,c++编译器会声明下面函数:拷贝构造函数.赋值运算符,析构函数,一对取地址运算符函数(const和非const).而假设你没有声明不论 ...
- AFNetworking的详细解析
AFNetworking serializer 分析 AFNetworkResponse.png 1. AFHTTPRequestOperationManager *manager = [AFHTTP ...
- c++中cin的基本使用方法
一.最主要的使用方法cin>> 接收一个数字.字符.字符串.遇"空格"."TAB"."回车"都结束 比如: <span s ...
- 将TensorFlow模型变为pb——官方本身提供API,直接调用即可
TensorFlow: How to freeze a model and serve it with a python API 参考:https://blog.metaflow.fr/tensorf ...
- php的string编码类型
在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ...
- Django day08 多表操作 (一) 多表模型创建
多表模型创建分析:1)作者表:一个作者有姓名和年龄2)作者信息表: 有作者就有信息,点击作者的名字可以查询他的电话和地址, 作者表对应作者信息表,所以他们之间是一对一对的关系3)出版社表: 出版社有对 ...
- Android插件化原理解析——Hook机制之动态代理
转自 http://weishu.me/2016/01/28/understand-plugin-framework-proxy-hook/ 使用代理机制进行API Hook进而达到方法增强是框架的常 ...