为了提供上下文,这个问题是关于一个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空间

  • 在此空间的数组索引处添加空终止字符

  • 以某种方式从我们停止的单词的第一个字符继续,并循环上述所有内容,直到我们拥有与文本段落一样多的行

上面使用三个中间变量来跟踪索引,三个循环,我认为它通常不优雅 .