Significado de topo, subida, linha de base, descida, fundo e liderança no FontMetrics do Android

89

Esta parece ser uma questão básica, mas não consegui encontrar uma semelhante no SO. Ao ler a documentação , tive problemas para entender os conceitos. Quero entender qual é a diferença entre tope ascente também bottome descent. E onde exatamente está a linha de base? Você tem um diagrama para me ajudar a visualizá-lo?

Suragch
fonte

Respostas:

279

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:

FontMetrics mostrando topo, subida, linha de base, decente, base e liderança

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 tope ascentsã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 topa bottomque 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ão0e 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 TextViewcomsetLineSpacing no código ou android:lineSpacingExtrae android:lineSpacingMultiplierem 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.

insira a descrição da imagem aqui

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 topou 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:

insira a descrição da imagem aqui

As marcas diacríticas vão acima tope 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 tope bottom. E geralmente eles ficarão dentro de ascente decent. Se por algum motivo você precisa saber com certeza se as letras vão além topou bottomvocê pode usar TextPaint.getTextBounds.

Suragch
fonte
Agradável! Você sabe em que unidades é medida a subida, descida, etc.? Eles estão em pixels? Eles são valores flutuantes, mas não tenho certeza de como eles correspondem à tela. Verifiquei no photoshop para ver se são pixels e se há uma ligeira diferença de algumas unidades; pixels sendo menores.
Vikram Gupta
@VikramGupta. As unidades são pixels. Não tenho certeza do que causou a diferença com sua verificação de imagem do photoshop.
Suragch
Obrigado pela explicação útil e pelo aplicativo. Mas, você pode explicar melhor, o que é exatamente Top? Haverá alguma letra alta o suficiente para tocar a Toplinha? Por exemplo, "M", "l" parece ser a letra mais alta. Nenhum deles se tocando Top.
Cheok Yan Cheng
@CheokYanCheng, veja a atualização no final da minha resposta.
Suragch
@Suragch Obrigado pela informação. Eu uso seu aplicativo para entender mais. Espero que a linha "Ascent" toque o topo da fonte de maneira adequada, como na imagem. No entanto, a partir do último i.imgur.com/aRxgjvu.png , ele não está tocando o personagem mais alto "M". Tens alguma ideia do porquê?
Cheok Yan Cheng
5

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 ):

Em tipografia, o início de / ˈlɛdɪŋ / refere-se à distância entre as linhas de base de linhas sucessivas de tipo. O termo originou-se na época da composição à mão, quando tiras finas de chumbo eram inseridas nos formulários para aumentar a distância vertical entre as linhas do tipo.

Pelo que posso dizer, o Android não tem como especificar isso.

Tom principal
fonte
1 por me ajudar a entender melhor a liderança. No que diz respeito a mudar a direção vai, você pode usar TextView de setLineSpacingno código ou android:lineSpacingExtrae android:lineSpacingMultiplierem xml.
Suragch
Obrigado - sim, nos disseram para usar o android:lineSpacingExtraque 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.
MajorTom
1
Se o avanço tipográfico é a distância entre as linhas de base, parece que deve ser fácil de calcular.
Suragch
Isso foi o que eu pensei. Existe uma maneira de fazer isso programaticamente? Eu esperava, com os métodos fornecidos pelo Android, que pudesse haver uma maneira de fazer isso. Os desenvolvedores com quem trabalhamos não parecem saber.
MajorTom
Já faz um tempo que não trabalho com isso, mas se fosse retomar, começaria aqui e aqui e faria experiências com textos e fontes diferentes. Mesmo que não seja direto, não posso acreditar que não haja uma maneira de calcular o que você precisa.
Suragch