2012-03-28 23 views
5

Ich versuche, einen Text in der Mitte einer Bitmap zu zeichnen, aber ich kann es nicht tun, obwohl ich align.center verwendet habe. Der Code lautet:Text auf einer Bitmap zentrieren

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

Was mache ich falsch?

+1

entfernen Sie diese paint.setTextAlign (Align.CENTER); und ersetze diese canvas.drawText (gText, x * Skala, y * Skala, Farbe); von diesem canvas.drawText (gText, x, y, Farbe); hoffe, das wird helfen – Triode

Antwort

12

Es ist viel einfacher als Sie denken.

Zeichnen Sie den Text bei der Hälfte der Bitmap Breite und Höhe (Mittelpunkt) in Kombination mit Paint.setTextAlign(Align.CENTER).

Die Ausrichtungseigenschaft kümmert sich um den Rest.

+0

wow, wusste nie über diese Flagge. toller Tipp! – Anton

+0

Große Antwort :) – Madhu

0

Wo ist die Textzeichnung? Das Problem könnte darin liegen, dass Sie den Text an Align.CENTER angepasst haben. Ihr Code, der x und y berechnet, geht davon aus, dass das Text-Rendering Align.LEFT verwendet, glaube ich.

Entweder verwenden SetTextAlign (Align.CENTER) und an der tatsächlichen Mitte Bitmap machen oder verwenden SetTextAlign (Align.LEFT) und verwenden, um die aktuellen X- und Y-Berechnungen Sie verwenden.

1

Ich denke, keine der oben angegebenen Antworten sind gut genug, also poste ich meine Antwort. Probieren Sie es aus Jungs, es wird auf allen Geräten funktionieren und ist überhaupt nicht komplex:

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

Das ist fast richtig, aber es wird nicht funktionieren für "ich", "1", ".", ... - das wird mehr auf der linken Seite sein und wird kläglich auf "-" (wird etwas links und weit über der Mitte sein). Versuchen Sie es mit canvas.drawText (Text, x - Grenzen.links, y - Grenzen.unten, Farbe); dann wird Text wirklich in der Mitte sein. –

+0

Das Übergeben von x und y in die drawText-Methode ist der beste Ansatz. Vielen Dank! – Azrael94

Verwandte Themen