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

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.

  • Texto del centro de Android sobre lienzo
  • Por qué mi invocación de Canvas.drawText () simplemente no funciona
  • lienzo drawtext con multilínea
  • Una suave animación de texto muy lenta en un lienzo de Android, SUBPIXEL_TEXT_FLAG no funciona
  • Android canvas drawText y-posición del texto
  • ¿Cómo alinear el texto verticalmente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.