为了提供上下文,这个问题是关于一个Arduino项目,我有一个OLED显示屏(256x64),我想将一段文本分成多行(即“左对齐”)以适合OLED .
我将从我自己的函数调用中执行此操作,我的问题是如何编写此函数 . 有很多方法可以给这只猫皮肤,但我正在寻找最明智和优雅的方式 .
我正在使用u8g图形库,它具有返回给定字体的字符串宽度的函数 . 它还可以返回字体的高度 . 因此,没有理由将行高传递给我的函数,只有起始的x和y位置,文本和包装文本的x位置 .
Question 1: is this sensible?
void drawMultiLine (char* text, byte startx, byte starty, byte endx)
我不考虑分页或滚动,所以不需要一个“endy”变量 .
Question 2: how would you write this function?
您能否提供最有效的方法的顶级描述?
我并不关心单词太长而无法放在一行上的情况 . 它可以在没有连字符的情况下打破该行,或者只是不包裹该单词(即超出边界) .
例如,我试过这个,但放弃了,因为它似乎太复杂了:
-
循环遍历
text[]
数组的每个字符,并将每个char分配给缓冲区的等效数组索引buff[]
-
null为此循环的每次迭代终止buff,以便我们可以使用
u8g.getStrWidth
返回到目前为止的字符串宽度
当u8g.getStrWidth(buff) > endx - startx
-
停止循环
-
现在char数组
buff
中的文本如果我们打印它将适合显示的宽度,但是我们想要包装单词,所以从buff []数组的末尾向后追踪以找到第一个ASCII空间 -
在此空间的数组索引处添加空终止字符
-
以某种方式从我们停止的单词的第一个字符继续,并循环上述所有内容,直到我们拥有与文本段落一样多的行
上面使用三个中间变量来跟踪索引,三个循环,我认为它通常不优雅 .