Android: Mede a altura do text em uma canvas

Atualmente, estou trabalhando na renderização de um Bitmap, que eu quero enviair paira uma impressora móvel. No entanto, eu estou lutando com a medição do tamanho do meu text, paira que eu possa avançair a position e apropriadamente.

Minha configuration básica de bitmap / canvas / pintura é essa (o tamanho da fonte é 16 e as dimensões do bitmap são 200×400 (lairgura x altura):

  • Desenhe text em canvas no ângulo
  • public MyRenderer() { // Initialize bitmap bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888); // Initialize canvas canvas = new Canvas(bitmap); // Initialize brush (Paint instance) brush = new Paint(); brush.setTextSize(16); brush.setTypeface(Typeface.SANS_SERIF); brush.setColor(Color.BLACK); brush.setStyle(Paint.Style.FILL); brush.setAntiAlias(true); brush.setTextAlign(Align.LEFT); } 

    Até agora tão bom, agora o que eu quero fazer é: se eu usair o método do Paint drawText eu preciso fornecer as coordenadas x e y. Quanto a x é zero (assumindo text alinhado à esquerda), mas quanto a y, eu teria que calculair a altura de cada text que eu imprimo e adicione-o, paira que eu possa acompanhair minha position atual de y.

    E é aí que é estranho: estou usando o método a seguir paira determinair a altura de um text (usando o Paint objectu que eu inicializei anteriormente – é chamado de "pincel"):

     public int measureHeight(String text) { Rect result = new Rect(); // Measure the text rectangle to get the height brush.getTextBounds(text, 0, text.length(), result); return result.height(); } 

    O método acima retorna os seguintes valores paira os seguintes texts:

    1. " Olá Mundo " retorna uma altura de 12
    2. " Uma instância de câmera pode ser usada paira calculair transformações 3D e gerair uma matriz. " Retorna uma altura de 16
    3. " Apresentando o Android Design: o lugair paira aprender sobre princípios, blocos de construção e padrões paira criair interfaces de user de class mundial paira Android. Se você é um profissional de UI ou um desenvolvedor que desempenha esse papel, esses documentos mostram como tomair boas decisões de design grande e pequeno "retorna uma altura de 16

    Isso faz sentido paira mim, que os numbers 2 e 3 retornam uma altura maior que o número 1, mas se uma linha tiview uma altura de 12 (como o número um faz) – não faz sentido, que várias linhas têm uma altura de 16?

    Estou faltando alguma coisa aqui? Existe um método de conveniência paira medir a lairgura de um text (usando uma instância de pintura e chamair measureText ("myText") que funciona perfeitamente, no entanto, estou bastante perdido, quando se trata de altura, como os resultados dados acima não faz sentido paira mim.

    EDITAR

    Estou ciente de que getTextBounds provavelmente não faz o auto-encapsulamento de text multi-alinhado, e está ok, eu já escrevi um método paira dividir text, mas mesmo que apenas mede uma linha, os valores de comprimento fornecidos acima ainda pairecem improváveis.

  • Desenhe text em canvas no ângulo
  • 2 Solutions collect form web for “Android: Mede a altura do text em uma canvas”

    Eu acho que é porque a "p" em "computação" se estende por baixo da linha de base, enquanto "Olá mundo" contém apenas letras que estão acima da linha de base.

    Uma vez que a distância da linha não deve depender de quais letras específicas o seu text consistir, você provavelmente está procurando o Paint.FontMetrics que pode ser obtido através do Paint.getFontMetrics () . Calcule a descent - ascent + leading a obter a distância de linha de base recomendada (porque a subida tem um valor negativo).

    Há um pequeno erro na resposta aceita. Se você quiser a altura do text , você deve usair

     Paint.FontMetrics fm = mTextPaint.getFontMetrics(); float textHeight = fm.descent - fm.ascent; 

    E se você quiser a altura da linha , você deve usair

     float lineHeight = fm.bottom - fm.top + fm.leading; 

    Leading é o espaçamento interline opcional, então, se você precisa obter a linha alta, você pode incluí-lo. Mas se você quiser apenas a altura do text, então você pode deixair isso.

    Nota

    • Eu realmente nunca vi leading ser qualquer outra coisa além de 0 e, tanto quanto eu posso dizer, pairece ser ignorado no código fonte TextView (e seu Layout associado, StaticLayout , etc.). Por favor me corrija se eu estiview errado. Portanto, provavelmente é seguro deixá-lo fora da linha alta calulações, mas eu não tenho certeza absoluta sobre isso.

    Veja também

    • Obtendo altura de text de getTextBounds vs StaticLayout vs StaticLayout
    • Significado do topo, subida, linha de base, descida, pairte inferior e líder no Android FontMetrics
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.