Estoy tratando de mostrar un texto usando el código a continuación. El problema es que el texto no está centrado horizontalmente. Cuando configuro las coordenadas para drawText
, establece la parte inferior del texto en esta posición. Me gustaría que el texto se dibuje para que el texto esté centrado también horizontalmente.
Esta es una imagen para mostrar más mi 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
fuente
fuente
Respuestas:
Intenta lo siguiente:
fuente
float halfLength = text.length() / 2f;
esto se llama promoción de tipo .Paint.descent()
yPaint.ascent()
) con el enfoque de centrar textoPaint.getTextBounds()
en mi respuesta a continuación.Paint.descent()
yPaint.ascent()
no tenga en cuenta el texto real. (Puede reconocer esta inexactitud en la captura de pantalla de mi publicación a continuación). Es por eso que recomendaría este enfoque. El enfoque conPaint.getTextBounds()
parece funcionar más preciso.Centro con Paint.getTextBounds () :
Paint.Align.CENTER no significa que el punto de referencia del texto esté centrado verticalmente. El punto de referencia siempre está en la línea de base. Entonces, ¿por qué no usar Paint.Align.LEFT ? Tienes que calcular el punto de referencia de todos modos.
Paint.descent () tiene la desventaja de que no considera el texto real. Paint.descent () recupera el mismo valor, independientemente de si el texto contiene letras con descensos o no. Es por eso que uso r.bottom en su lugar.
He tenido algunos problemas con Canvas.getHeight () si API <16. Es por eso que uso Canvas.getClipBounds (Rect) en su lugar. (No use Canvas.getClipBounds (). GetHeight () ya que asigna memoria para un Rect .)
Por razones de rendimiento, debe asignar objetos antes de que se usen en onDraw () . Como drawCenter () será llamada dentro onDraw () del objeto Rect r está preasignado como un campo aquí.
Traté de poner el código de las dos respuestas principales en mi propio código (agosto de 2015) e hice una captura de pantalla para comparar los resultados:
El texto debe estar centrado dentro del rectángulo relleno de rojo. Mi código produce el texto blanco, los otros dos códigos producen en conjunto el texto gris (en realidad son lo mismo, se superponen). El texto gris es un poco demasiado bajo y dos más a la derecha.
Así es como hice la prueba:
fuente
Alinear verticalmente es difícil porque sucedió el descenso y el ascenso del texto, muchos chicos usaron Paint.getTextBounds () para recuperar TextWidth y TextHeight, pero no hace que el texto se centre demasiado. Aquí podemos usar Paint.measureText () para calcular TextWidth, TextHeight que simplemente restamos con descenso y ascenso, luego obtuvimos la mayor aproximación TextSize, el siguiente trabajo es bastante fácil el uno para el otro.
Por cierto, recomendamos usar RectF en lugar de Rect porque las posiciones necesitan valores más precisos, en mi experiencia, RectF realizó la desviación superior e inferior solo un píxel en el dispositivo xhdpi, Rect sería dos más.
fuente
Su código está dibujando el centro de la línea de base del texto, en el centro de la vista. Para centrar el texto en algún punto, x, y, debe calcular el centro del texto y poner eso en el punto.
Este método dibujará texto centrado en el punto x, y. Si lo pasa al centro de su vista, dibujará el texto centrado.
fuente
android.graphics.Paint
se usa para dibujar el textoEncuentro que la mejor solución para centrar texto es la siguiente:
fuente
funciona para mí usar: textPaint.textAlign = Paint.Align.CENTER con textPaint.getTextBounds
el resultado es:
fuente
Creo un método para simplificar esto:
rectF es el área que desea dibujar el texto, eso es todo. Detalles
fuente
Si estamos usando diseño estático
Layout.Alignment.ALIGN_CENTER esto hará el truco. El diseño estático también tiene muchas otras ventajas.
Referencia: Documentación de Android
fuente
Esto funcionó para mí:
si alguien encuentra algún problema por favor avíseme
fuente
En mi caso, no tuve que poner el texto en el medio de un lienzo, sino en una rueda que gira. Aunque tuve que usar este código para tener éxito:
Luego llamo a este método desde la clase View:
fuente