Android canvas drawText y-posición del texto

Estoy usando una lona para crear un dibujable con un cierto fondo y un poco de texto. El dibujable se utiliza como un compuesto dibujable dentro de un EditText.

El texto se dibuja vía drawText () en el lienzo, pero tengo un problema con la posición-y del texto dibujado en algunos casos. En esos casos se cortan partes de algunos caracteres (ver enlaces de imagen).

Personajes sin problema de posicionamiento:

Http://i50.tinypic.com/zkpu1l.jpg

Personajes con problema de posicionamiento, el texto contiene 'g', 'j', 'q', etc .:

Http://i45.tinypic.com/vrqxja.jpg

Puede encontrar un fragmento de código para reproducir el problema a continuación.

¿Cualquier experto sabe cómo determinar el desplazamiento correcto para la posición y?

public void writeTestBitmap(String text, String fileName) { // font size float fontSize = new EditText(this.getContext()).getTextSize(); fontSize+=fontSize*0.2f; // paint to write text with Paint paint = new Paint(); paint.setStyle(Style.FILL); paint.setColor(Color.DKGRAY); paint.setAntiAlias(true); paint.setTypeface(Typeface.SERIF); paint.setTextSize((int)fontSize); // min. rect of text Rect textBounds = new Rect(); paint.getTextBounds(text, 0, text.length(), textBounds); // create bitmap for text Bitmap bm = Bitmap.createBitmap(textBounds.width(), textBounds.height(), Bitmap.Config.ARGB_8888); // canvas Canvas canvas = new Canvas(bm); canvas.drawARGB(255, 0, 255, 0);// for visualization // y = ? canvas.drawText(text, 0, textBounds.height(), paint); try { FileOutputStream out = new FileOutputStream(fileName); bm.compress(Bitmap.CompressFormat.JPEG, 100, out); } catch (Exception e) { e.printStackTrace(); } } 

Creo que es probablemente un error asumir que textBounds.bottom = 0. Para aquellos caracteres descendentes, las partes inferiores de esos caracteres están probablemente por debajo de 0 (lo que significa textBounds.bottom> 0). Es probable que desee algo como:

canvas.drawText(text, 0, textBounds.top, paint); //instead of textBounds.height()

Si tu textBounds es de +5 a -5, y dibujas el texto en y = height (10), entonces solo verás la mitad superior del texto.

Creo que si quieres dibujar texto cerca de la esquina superior izquierda deberías hacer esto:

 canvas.drawText(text, -textBounds.left, -textBounds.top, paint); 

Y usted puede moverse alrededor del texto sumando la cantidad deseada del desplazamiento a las dos coordenadas:

 canvas.drawText(text, -textBounds.left + yourX, -textBounds.top + yourY, paint); 

La razón por la que esto funciona (al menos para mí) es que getTextBounds () le dice donde drawText () dibujaría el texto en el caso de que x = 0 ey = 0. Así que tienes que contrarrestar este comportamiento restando el desplazamiento (textBounds.left y textBounds.top) introducido por la forma en que se maneja el texto en Android.

En esta respuesta elaboro un poco más sobre este tema.

  • Texto que no se muestra en la superposición de MapView
  • Android: Alinea un texto a la izquierda y centra la vista de texto en la vista de los padres
  • TextView dentro de ViewPager intercepta eventos de toque
  • ¿Cómo subraya un texto en android xml?
  • Color del texto del cambio del androide de artículos en hilandero
  • Small Caps en TextViews, EditTexts y botones en Android
  • ¿Cómo lo hicieron? Diálogos sobre la pantalla de inicio
  • QPushButton ha duplicado texto después de la actualización Qt
  • Desplazamiento horizontal del texto en Android
  • ¿Cómo puedo configurar el color de texto de resumen de preferencias de Android?
  • ¿Cómo puedo utilizar TypefaceSpan o StyleSpan con un tipo de letra personalizado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.