2012-03-28 14 views
5

Estoy tratando de dibujar un texto en el centro de un mapa de bits, pero no puedo hacerlo aunque utilicé align.center. El código es:Texto central en un mapa de bits

public Bitmap drawTextToBitmap(Context gContext, String gText) { 
    Resources resources = gContext.getResources(); 
    float scale = resources.getDisplayMetrics().density; 
    Bitmap bitmap = 
      BitmapFactory.decodeResource(resources, R.drawable.blank_marker); 

    android.graphics.Bitmap.Config bitmapConfig = 
      bitmap.getConfig(); 
    // set default bitmap config if none 
    if(bitmapConfig == null) { 
     bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; 
    } 
    // resource bitmaps are imutable, 
    // so we need to convert it to mutable one 
    bitmap = bitmap.copy(bitmapConfig, true); 

    Canvas canvas = new Canvas(bitmap); 
    // new antialised Paint 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    // text color - #3D3D3D 
    paint.setColor(Color.rgb(61, 61, 61)); 
    // text size in pixels 
    paint.setTextSize((int) (25 * scale)); 
    // text shadow 
    paint.setShadowLayer(1f, 0f, 1f, Color.WHITE); 

    // draw text to the Canvas center 
    Rect bounds = new Rect(); 
    paint.setTextAlign(Align.CENTER); 

    paint.getTextBounds(gText, 0, gText.length(), bounds); 
    int x = (bitmap.getWidth() - bounds.width())/2; 
    int y = (bitmap.getHeight() + bounds.height())/2; 

    canvas.drawText(gText, x * scale, y * scale, paint); 

    return bitmap; 
} 

¿Qué estoy haciendo mal?

+1

Poner esta paint.setTextAlign (Align.CENTER); y reemplace este canvas.drawText (gText, x * scale, y * scale, paint); por este canvas.drawText (gText, x, y, paint); Espero que esto ayude – Triode

Respuesta

12

Es mucho más directo de lo que crees.

Dibuje el texto a la mitad del ancho y alto de Bitmap (punto central) en combinación con Paint.setTextAlign(Align.CENTER).

La propiedad de alineación se ocupará del resto.

+0

guau, nunca supe sobre esta bandera. consejo increíble! – Anton

+0

Gran respuesta :) – Madhu

0

¿Dónde está el dibujo de texto? El problema podría ser que ha cambiado el texto al alinear a Align.CENTER. El código que calcula xey supone que la representación del texto está utilizando Align.LEFT, creo.

O utilice setTextAlign (Align.CENTER) y renderice en el centro de mapa de bits real, o use setTextAlign (Align.LEFT) y utilice los cálculos xey actuales que esté utilizando.

1

Creo que ninguna de las respuestas dadas anteriormente son lo suficientemente buenas, así que publico mi respuesta. Probarlo chicos, que funcionará en todos los dispositivos y no es en absoluto compleja:

Canvas canvas = new Canvas(bitmap); 

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    //paint.setTextAlign(Align.CENTER); 
    paint.setColor(activity.getResources().getColor(R.color.white)); 
    paint.setTextSize(30); 

    // draw text to the Canvas center 
    Rect boundsText = new Rect(); 
    paint.getTextBounds(String.valueOf(cluster.getMarkerList().size()), 
      0, String.valueOf(cluster.getMarkerList().size()).length(), 
      boundsText); 
    int x = (bitmap.getWidth() - boundsText.width())/2; 
    int y = (bitmap.getHeight() + boundsText.height())/2; 

    canvas.drawText(String.valueOf(cluster.getMarkerList().size()), x, 
      y, paint); 
+0

Esto es casi correcto, pero no funcionará para "i", "1", ".", ... - estos serán más a la izquierda y fallarán miserablemente en "-" (estará ligeramente a la izquierda y muy por encima del medio). Intente usar canvas.drawText (texto, x - bounds.left, y - bounds.bottom, paint); entonces el texto estará realmente en el medio. –

+0

Pasar xey en el método drawText es el mejor enfoque. ¡Gracias! – Azrael94

Cuestiones relacionadas