2012-05-15 17 views
25

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.Lienzo de Android drawText y-position de texto

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 tema de posicionamiento, de 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(); 
    } 
} 

Respuesta

25

creo que es probablemente un error suponer que textBounds.bottom = 0. Para aquellos caracteres que descienden, las partes inferiores de los personajes son probablemente por debajo de 0 (que significa textBounds.bottom> 0). Es posible que desee algo como:

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

Si sus textBounds es de +5 a -5, y se dibuja el texto en y = altura (10), a continuación, sólo verá la mitad superior del texto .

+13

Gracias por apuntarme en la dirección correcta. canvas.drawText (text, 0, textBounds.height() - textBounds.bottom, paint); fue la solución – darksaga

10

Creo que si desea dibujar el texto cerca de la esquina superior izquierda que debe hacer esto:

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

Y se puede mover alrededor del texto sumando la cantidad deseada de desplazamiento de 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() que indica dónde drawText() sería dibujar el texto en el caso de que x = 0 ey = 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 this answer Elaboro un poco más sobre este tema.