studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android text canvas position drawtext

para - manual de programacion android pdf



Lienzo de Android drawText y-position de texto (2)

Creo que probablemente sea un error suponer que textBounds.bottom = 0. Para aquellos personajes que descienden, las partes inferiores de esos caracteres probablemente están por debajo de 0 (lo que significa textBounds.bottom> 0). Probablemente quieras algo como:

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

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

Estoy usando un lienzo para crear un Drawable con un poco de fondo y algo de texto. El dibujable se usa como un compuesto dibujable dentro de un EditText.

El texto se dibuja mediante drawText () en el lienzo, pero en algunos casos tengo un problema con la posición y del texto dibujado. En esos casos, algunas partes de algunos caracteres se cortan (ver enlaces de imágenes).

Caracteres sin problema de posicionamiento:

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

Caracteres con problemas 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.

¿Algún experto sabe cómo determinar la compensación adecuada 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 si quieres dibujar texto cerca de la esquina superior izquierda debes hacer esto:

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

Y puede moverse por el texto sumando la cantidad deseada de 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 () te dice dónde drawText () dibujaría el texto en el caso de que x = 0 e y = 0. Por lo tanto, debe 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 , elaboraré un poco más sobre este tema.