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
.
Top
? Haverá alguma letra alta o suficiente para tocar aTop
linha? Por exemplo, "M", "l" parece ser a letra mais alta. Nenhum deles se tocandoTop
.Entrelinha NÃO é espaço entre linhas na tipografia. Aparentemente, isso é algo que o código do Android não leva em consideração. Nós mesmos temos lutado contra isso. A definição adequada de líder ( da Wikipedia ):
Pelo que posso dizer, o Android não tem como especificar isso.
fonte
setLineSpacing
no código ouandroid:lineSpacingExtra
eandroid:lineSpacingMultiplier
em xml.android:lineSpacingExtra
que colocaria uma medida entre o espaço real entre as linhas. Não está liderando, mas parece ser a única maneira de gerenciar o espaçamento. É um problema porque não existe tal medida na tipografia, e não existe tal forma de especificar essa medida no Sketch ou Zepelin (as ferramentas que usamos). Além disso, não corresponde ao líder.