Centro del texto vertical y horizontalmente con lienzo
Estoy tratando de alinear un texto en el mapa de bits horizontal y verticalmente, he leído varios post pero no puedo encontrar una solución. El mapa de bits es una simple imagen de un círculo. Publico mi código actual. Más o menos funciona, pero el texto no está perfectamente centrado, parece un poco a la izquierda y un poco en la parte superior, quiero decir que parece que tengo que añadir un desplazamiento para moverlo a la derecha y al fondo.
public static float convertDpToPixel(float dp, Context context) { Resources resources = context.getResources(); DisplayMetrics metrics = resources.getDisplayMetrics(); float px = dp * (metrics.densityDpi / 160f); return px; } v = (ImageView) findViewById(R.id.imageView1); Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.marker).copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(b); Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); textPaint.setARGB(255, 0, 0, 0); textPaint.setTextAlign(Align.CENTER); textPaint.setTypeface(Typeface.DEFAULT_BOLD); textPaint.setTextSize(convertDpToPixel(9, this)); String text = "30"; int xPos = (canvas.getWidth() / 2); int yPos = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2)) ; canvas.drawText(text, xPos, yPos, textPaint); v.setImageBitmap(b);
- Dibujar el texto verticalmente sobre lienzo
- Android drawText caracteres que faltan en Lollipop
- Lienzo dibujar texto html
- Cómo dibujar un texto de gran tamaño en un lienzo?
- Posicionamiento de lienzo
- Cómo dibujar una cadena Spanned con Canvas.drawText en Android
- Cómo posicionar StaticLayout en android?
- Dibujo de texto en ángulo (por ejemplo, al revés) en Android
- Android 4.2 en Nexus 7: canvas.drawText () no funciona correctamente
- Cómo saber el tamaño de un texto al usar Canvas.drawText ()
- Android Canvas.drawText no renderizado
- Dibuja un texto en una ruta circular en android
- Android Canvas.drawText
El problema es que actualmente no está considerando el ancho y la altura del texto. Si su texto es "hola" o "ESTA UNA CUERDA" usted apenas la trata igualmente, así que está mal.
Debe calcular el ancho y la altura del texto y, a continuación, cambiar la posición del texto por la mitad de esas distancias.
Por ejemplo, para centrar verticalmente:
Rect r = new Rect(); paint.getTextBounds(text, 0, text.length(), r); yPos += (Math.abs(r.height()))/2; // or maybe -= instead of +=, depends on your coordinates
Espero que esto te lleva en la dirección correcta.
EDIT: El origen se interpreta en función del ajuste Align en la pintura. Estás usando
textPaint.setTextAlign(Align.CENTER);
Así que probablemente no es necesario hacer cálculos para centrar horizontalmente (lo que significa que para el origen horizontal debe utilizar el código que ya tenía).
int xPos = (canvas.getWidth() / 2);
Como @Merlevede dice, si usted alinea el textPaint a CENTER, sólo tiene que hacer:
canvas.drawText( text, canvas.getWidth() / 2, ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2)), textPaint );
Para la posición horizontal: xPos = (canvas.getWidth() / 2) - (widthofthetext)/2;
Para vertical: yPos = (canvas.getHeight() / 2) - (heightofthetext)/2;
Lo estoy enviando desde el teléfono y lo siento por la respuesta no probada. Avísame si funciona.
- Protocolo de archivo bloqueo inesperado de Android studio
- ¿OnDestroy () o finish () matan realmente la actividad?