Vamos primeiro revisar o que a documentação diz :
- Superior - A distância máxima acima da linha de base para o glifo mais alto da fonte em um determinado tamanho de texto.
- Subida - A distância recomendada acima da linha de base para texto com espaçamento simples.
- Descida - A distância recomendada abaixo da linha de base para texto com espaçamento simples.
- Inferior - A distância máxima abaixo da linha de base para o glifo mais baixo na fonte em um determinado tamanho de texto.
- Entrelinha - O espaço adicional recomendado para adicionar entre as linhas de texto.
Observe que a linha de base é a partir da qual os quatro primeiros são medidos. É a linha que forma a base sobre a qual o texto assenta, embora alguns caracteres (como g, y, j, etc.) possam ter partes que vão abaixo da linha. É comparável às linhas que você escreve em um caderno pautado.
Aqui está uma imagem para ajudar a visualizar essas coisas:
Lembre-se de que, ao desenhar em uma tela em Java e Android, descer é um aumento em y e subir é uma diminuição em y. Isso significa que FontMetrics top
e ascent
são números negativos, pois são medidos a partir da linha de base (enquanto a descida e o fundo são números positivos). Assim, para obter a distância top
a bottom
que você precisa fazer ( bottom
- top
).
O líder é a distância entre o final de uma linha e o topo da próxima linha. Na imagem acima, é o espaço entre o laranja da Linha 1 e o roxo da Linha 2. Como @MajorTom observou abaixo , na tipografia o termo é mais apropriadamente definido como "a distância entre as linhas de base de linhas sucessivas do tipo". * No entanto, o Android parece usar o termo no sentido mais histórico. A palavra (pronuncia-se "ledding") vem da faixa de chumbo que os antigos compositores costumavam colocar entre as linhas do texto. Era basicamente uma forma de ajustar o espaçamento entre linhas. No Android, nunca vi o líder ser outra coisa senão0
e não o vi usado para nada no código-fonte. (Corrija-me se você souber onde ele é usado para calcular qualquer coisa.) Você pode alterar o espaçamento entre linhas TextView
comsetLineSpacing
no código ou android:lineSpacingExtra
e android:lineSpacingMultiplier
em xml. Esses métodos , entretanto, não fazem uso ou modificam o entrelinhamento.
Confira estes links para obter mais informações:
Explore mais
Para explorar mais o Font Metrics, fiz um projeto simples.
Em vez de listar todo o código aqui. Eu adicionei o projeto ao GitHub . Você pode clonar o projeto ou copiar os arquivos a seguir em um novo projeto.
As letras alguma vez ficam acima top
ou abaixo bottom
?
Normalmente não, mas podiam. A parte superior e a inferior, pelo que entendi, são definidas pela fonte (daí "FontMetrics"), então um criador de fontes poderia fazer um glifo ficar mais alto do que o que eles dizem que é a parte superior (ou mais baixo que a parte inferior). Além disso, com a combinação de marcas diacríticas em Unicode, isso pode acontecer muito facilmente. Aqui está um exemplo bastante extremo (tirado de daqui): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡
Conectando essa string ao Android, obtemos o seguinte:
As marcas diacríticas vão acima top
e abaixo de bottom
. É interessante notar que a largura e a altura totais são medidas corretamente pelos limites do texto.
De qualquer forma, para todos os fins práticos em sua programação, você pode simplesmente assumir que o máximo e o mínimo para letras de glifo são top
e bottom
. E geralmente eles ficarão dentro de ascent
e decent
. Se por algum motivo você precisa saber com certeza se as letras vão além top
ou bottom
você pode usar TextPaint.getTextBounds
.