Estou tentando exibir um texto usando o código abaixo. O problema é que o texto não está centralizado horizontalmente. Quando defino as coordenadas para drawText
, ele define a parte inferior do texto nessa posição. Gostaria que o texto fosse desenhado para que o texto também se centrasse horizontalmente.
Esta é uma imagem para exibir ainda mais o meu problema:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawRGB(2, 2, 200);
Paint textPaint = new Paint();
textPaint.setARGB(200, 254, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(font);
textPaint.setTextSize(300);
canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2 , textPaint);
}
java
android
android-activity
android-canvas
drawtext
Sebastian
fonte
fonte
Respostas:
Tente o seguinte:
fonte
float halfLength = text.length() / 2f;
isso é chamado de promoção de tipo .Paint.descent()
ePaint.ascent()
) com a abordagem centralizada no textoPaint.getTextBounds()
na minha resposta abaixo.Paint.descent()
ePaint.ascent()
não leve em consideração o texto real. (Você pode reconhecer essa imprecisão na captura de tela na minha postagem abaixo.) É por isso que eu recomendaria essa abordagem. A abordagem comPaint.getTextBounds()
parece funcionar mais precisa.Centralize com Paint.getTextBounds () :
Paint.Align.CENTER não significa que o ponto de referência do texto esteja centralizado verticalmente. O ponto de referência está sempre na linha de base. Então, por que não usar o Paint.Align.LEFT ? Você precisa calcular o ponto de referência de qualquer maneira.
Paint.descent () tem a desvantagem de não considerar o texto real. Paint.descent () recupera o mesmo valor, independentemente de o texto conter letras com descidas ou não. É por isso que eu uso o r.bottom .
Eu tive alguns problemas com o Canvas.getHeight () se a API <16. É por isso que eu uso o Canvas.getClipBounds (Rect) . (Não use Canvas.getClipBounds (). GetHeight () , pois aloca memória para um Rect .)
Por motivos de desempenho, você deve alocar objetos antes que eles sejam usados no onDraw () . Como drawCenter () será chamado dentro de onDraw (), o objeto Rect r será pré-alocado como um campo aqui.
Tentei colocar o código das duas principais respostas no meu próprio código (agosto de 2015) e fiz uma captura de tela para comparar os resultados:
O texto deve estar centralizado dentro do retângulo preenchido em vermelho. Meu código produz o texto em branco, os outros dois códigos produzem todo o texto em cinza (eles são na verdade o mesmo, sobrepostos). O texto em cinza está um pouco baixo demais e dois à direita.
Foi assim que fiz o teste:
fonte
Alinhar verticalmente é difícil porque aconteceu a descida e a subida do texto, muitos caras usaram o Paint.getTextBounds () para recuperar TextWidth e TextHeight, mas isso não torna o texto centralizado. Aqui, podemos usar o Paint.measureText () para calcular a TextWidth, a TextHeight, que simplesmente subtraímos com descida e subida; depois, temos a abordagem mais aproximada do TextSize; o trabalho a seguir é bastante fácil para o outro.
A propósito, é altamente recomendável usar RectF em vez de Rect, porque as posições precisam de valores mais precisos. Na minha experiência, o RectF fez o desvio superior e inferior de apenas um pixel no dispositivo xhdpi; o Rect seria mais dois.
fonte
Seu código está desenhando o centro da linha de base do texto, no centro da vista. Para centralizar o texto em algum momento, x, y, você precisa calcular o centro do texto e colocá- lo no ponto.
Este método desenhará o texto centrado no ponto x, y. Se você passar o centro da sua visualização, ele desenhará o texto centralizado.
fonte
android.graphics.Paint
ser usado para desenhar o textoAcho que a melhor solução para centralizar o texto é a seguinte:
fonte
funciona para eu usar: textPaint.textAlign = Paint.Align.CENTER com textPaint.getTextBounds
O resultado é:
fonte
Eu crio um método para simplificar isso:
rectF é a área que você deseja desenhar o texto, é isso. Detalhes
fonte
Se estivermos usando layout estático
Layout.Alignment.ALIGN_CENTER isso fará o truque. O layout estático também tem muitas outras vantagens.
Referência: documentação do Android
fonte
Isso funcionou para mim:
se alguém encontrar algum problema, por favor me avise
fonte
No meu caso, não precisei colocar o texto no meio de uma tela, mas em uma roda que gira. Embora eu tivesse que usar esse código para ter sucesso:
Então eu chamo esse método da classe View:
fonte