2012-03-28 10 views
5

Sto provando a disegnare un testo al centro di una bitmap, ma non riesco a farlo anche se ho usato align.center. Il codice è:Centra il testo su una bitmap

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

Cosa sto facendo male?

+1

rimuovere this paint.setTextAlign (Align.CENTER); e sostituisci questo canvas.drawText (gText, x * scale, y * scale, paint); da questo canvas.drawText (gText, x, y, paint); spero che questo possa aiutare – Triode

risposta

12

È molto più semplice di quanto si pensi.

Disegna il testo a metà della larghezza e dell'altezza dello Bitmap (punto centrale) in combinazione con Paint.setTextAlign(Align.CENTER).

La proprietà di allineamento si occuperà del resto.

+0

wow, non ho mai saputo di questa bandiera. fantastico consiglio! – Anton

+0

Great Answer :) – Madhu

0

Dove si trova il disegno del testo? Il problema potrebbe essere dovuto al fatto che il testo è stato allineato su Align.CENTER. Il tuo calcolo del codice xey presuppone che il rendering del testo stia usando Align.LEFT, credo.

Utilizzare setTextAlign (Align.CENTER) e renderizzare al centro bitmap effettivo oppure utilizzare setTextAlign (Align.LEFT) e utilizzare i calcoli xey correnti che si stanno utilizzando.

1

Immagino che nessuna delle risposte sopra riportate sia sufficiente per pubblicare la mia risposta. Provalo ragazzi, funzionerà su tutti i dispositivi e non è affatto complesso:

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

Questo è quasi corretto, ma non funzionerà per "i", "1", ".", ... - questi saranno più a sinistra e falliranno miseramente su "-" (sarà leggermente a sinistra e molto sopra la metà). Prova a usare canvas.drawText (testo, x - bounds.left, y - bounds.bottom, paint); allora il testo sarà davvero nel mezzo. –

+0

Passare xey nel metodo drawText è l'approccio migliore. Grazie! – Azrael94

Problemi correlati