Alguma maneira direta de medir a altura do texto? A maneira como estou fazendo isso agora é usando o Paint measureText()
para obter a largura e, em seguida, por tentativa e erro, encontrando um valor para obter uma altura aproximada. Eu também ando brincando FontMetrics
, mas todos esses parecem métodos aproximados que são ruins.
Estou tentando escalar as coisas para diferentes resoluções. Eu posso fazer isso, mas acabo com um código incrivelmente detalhado com muitos cálculos para determinar tamanhos relativos. Eu odeio isso! Tem que haver uma maneira melhor.
android
graphics
view
android-canvas
Danedo
fonte
fonte
Existem diferentes maneiras de medir a altura, dependendo do que você precisa.
getTextBounds
Se você está fazendo algo como centralizar com precisão uma pequena quantidade de texto fixo, provavelmente deseja
getTextBounds
. Você pode obter o retângulo delimitador como esteComo você pode ver nas imagens a seguir, cordas diferentes fornecerão alturas diferentes (mostradas em vermelho).
Essas alturas diferentes podem ser uma desvantagem em algumas situações em que você só precisa de uma altura constante, independentemente do texto. Veja a próxima seção.
Paint.FontMetrics
Você pode calcular a altura da fonte a partir das métricas da fonte. A altura é sempre a mesma porque é obtida a partir da fonte, não de qualquer sequência de texto específica.
A linha de base é a linha em que o texto se localiza. A descida é geralmente a mais longe que um personagem vai abaixo da linha e a subida é geralmente a mais longe que um personagem fica acima da linha. Para obter a altura, você deve subtrair a subida, porque é um valor negativo. (A linha de base é
y=0
ey
diminui a tela.)Veja a seguinte imagem. As alturas para as duas cordas são
234.375
.Se você deseja a altura da linha, e não apenas a altura do texto, faça o seguinte:
Estes são os
bottom
etop
da linha. O início (espaçamento entre linhas) geralmente é zero, mas você deve adicioná-lo de qualquer maneira.As imagens acima vêm deste projeto . Você pode brincar com ele para ver como as métricas de fonte funcionam.
StaticLayout
Para medir a altura do texto com várias linhas, use a
StaticLayout
. Eu falei sobre isso em detalhes nesta resposta , mas a maneira básica de obter essa altura é assim:fonte
getTextSize()
fornece o tamanho da fonte em unidades de pixel (ao contrário desp
unidades). @androiddeveloperA resposta do @ bramp está correta - parcialmente, na medida em que não menciona que os limites calculados serão o retângulo mínimo que contém o texto totalmente com coordenadas de início implícitas de 0, 0.
Isso significa que a altura de, por exemplo, "Py" será diferente da altura de "py" ou "oi" ou "oi" ou "aw" porque em termos de pixel eles exigem alturas diferentes.
Isso nunca é equivalente ao FontMetrics no java clássico.
Embora a largura de um texto não seja muito dolorosa, a altura é.
Em particular, se você precisar alinhar verticalmente o texto desenhado, tente obter os limites do texto "a" (sem aspas), em vez de usar o texto que você deseja desenhar. Funciona para mim...
Aqui está o que eu quero dizer:
Alinhar verticalmente o texto ao centro significa alinhar verticalmente o retângulo delimitador - o que é diferente para textos diferentes (maiúsculas, letras longas etc.). Mas o que realmente queremos fazer é também alinhar as linhas de base dos textos renderizados, para que eles não pareçam elevados ou ranhurados. Assim, desde que conheçamos o centro da menor letra ("a" por exemplo), poderemos reutilizar seu alinhamento pelo restante dos textos. Isso centralizará o alinhamento de todos os textos, bem como o alinhamento da linha de base.
fonte
x >> 1
há séculos. Upvoting apenas para que :)x / 2
e otimizá-lo parax >> 1
x / 2
é muito mais amigável ao ler código, considerando o comentário de Chris.buffer
neste exemplo? É ocanvas
passado para odraw(Canvas)
método?A altura é o tamanho do texto que você definiu na variável Paint.
Outra maneira de descobrir a altura é
fonte
Você pode usar a
android.text.StaticLayout
classe para especificar os limites necessários e depois chamargetHeight()
. Você pode desenhar o texto (contido no layout) chamando seudraw(Canvas)
método.fonte
Você pode simplesmente obter o tamanho do texto de um objeto Paint usando o método getTextSize (). Por exemplo:
fonte
24.0f
vem isso?Você deve usar
Rect.width()
e doRect.Height()
qual retornougetTextBounds()
. Isso funciona para mim.fonte
Se alguém ainda tiver problemas, este é o meu código.
Tenho uma exibição personalizada quadrada (largura = altura) e desejo atribuir um caractere a ela.
onDraw()
mostra como obter altura do personagem, embora não o esteja usando. O personagem será exibido no meio da vista.fonte