Android:在画布上测量文本高度

Android:在画布上测量文本高度,android,paint,android-canvas,Android,Paint,Android Canvas,我目前正在绘制位图,然后将其发送到移动打印机。但是,我正在努力测量文本的高度,以便可以适当地推进y位置 我的基本位图/画布/绘画配置如下(字体大小为16,位图尺寸为200x400(宽x高): 到目前为止还不错,现在我想做的是:如果我使用绘画的方法drawText,我需要提供x和y坐标。对于x,它是零(假设文本左对齐),但是对于y,我必须计算我打印的每个文本的高度并加起来,这样我就可以跟踪我当前的y位置 这就是它变得奇怪的地方:我使用以下方法来确定文本的高度(使用我之前初始化的Paint对象-它被

我目前正在绘制位图,然后将其发送到移动打印机。但是,我正在努力测量文本的高度,以便可以适当地推进y位置

我的基本位图/画布/绘画配置如下(字体大小为16,位图尺寸为200x400(宽x高):

到目前为止还不错,现在我想做的是:如果我使用绘画的方法drawText,我需要提供x和y坐标。对于x,它是零(假设文本左对齐),但是对于y,我必须计算我打印的每个文本的高度并加起来,这样我就可以跟踪我当前的y位置

这就是它变得奇怪的地方:我使用以下方法来确定文本的高度(使用我之前初始化的Paint对象-它被称为“笔刷”):

上述方法为以下文本返回以下值:

  • “Hello World”返回高度12
  • “摄影机实例可用于计算3D变换并生成矩阵。”返回高度16
  • “介绍Android设计:学习创建世界级Android用户界面的原则、构建块和模式的地方。无论您是UI专业人员还是扮演该角色的开发人员,这些文档都会告诉您如何做出好的设计决策,无论大小。”返回高度16
  • 对我来说,数字2和3返回的高度大于数字1是有道理的,但如果一行的高度为12(就像数字1一样),那么多行的高度为16就没有道理了

    这里我遗漏了什么吗?有一种方便的方法可以测量文本的宽度(使用paint实例并调用measureText(“myText”),它工作得很好,但是当涉及到高度时,我非常茫然,因为上面给出的结果对我来说没有任何意义

    编辑

    我知道,getTextBounds可能不会自动包装多行文本,这没关系,我已经编写了一个拆分文本的方法,但即使它只测量一行,上面给定的长度值似乎仍然不太可能。

    我认为这是因为“compute”中的“p”延伸到基线以下,而“Hello World”仅包含高于基线的字母


    由于行距离不应取决于文本中碰巧包含的特定字母,因此您可能正在寻找哪些字母可以通过以下方式获得:计算
    下降-上升+前导
    ,以获得建议的基线距离(因为上升具有负值).

    接受的答案中有一个小错误。如果需要文本高度,应使用

    Paint.FontMetrics fm = mTextPaint.getFontMetrics();
    float textHeight = fm.descent - fm.ascent;
    
    float lineHeight = fm.bottom - fm.top + fm.leading;
    
    如果你想知道线的高度,你应该使用

    Paint.FontMetrics fm = mTextPaint.getFontMetrics();
    float textHeight = fm.descent - fm.ascent;
    
    float lineHeight = fm.bottom - fm.top + fm.leading;
    
    行距是可选的行距,因此,如果需要获得行距,可以将其包括在内。但如果只需要文本高度,则可以不使用行距

    注意

    • 实际上,我从未见过
      前导
      0
      以外的任何东西,据我所知,它甚至似乎在中被忽略了(及其相关的,等等)。如果我错了,请纠正我。因此,它可能是安全的,它不符合行高计算,但我不能完全确定这一点
    另请参见


    我计算了基线距离(根据您的计算)对于上述三个给定的文本,它总是返回19。这是否意味着,如果我取19的高度,下一行仍然有足够的空间不与当前行重叠?非常感谢!这是字体的一个特征,您不必为不同的文本重复计算。您希望距离为无论文本由哪些字符组成,始终保持不变。是的,行不会重叠。非常感谢-这就是我所做的,现在渲染位图效果很好:)。我在MyRenderer的构造函数中初始化了一次“行高”。更简单的是: