2017-01-22 2 views
1

Ich muss Text in einer Bitmap horizontal und vertikal zentriert zeichnen, die Textgröße anpassen, um den gesamten Raum abzudecken. Das Problem ist, dass der Text mehrzeilig ist mit \n. Das ist mein aktueller Code:Leinwand drawtext multiline zentriert

private int determineMaxTextSize(String str, float maxWidth) { 
     int size = 0; 
     if (TextUtils.isEmpty(str)) 
      return 0; 
     Paint paint = new Paint(); 
     do { 
      paint.setTextSize(++size); 
     } while (paint.measureText(str) < maxWidth); 
     return size > 0 ? size - 1 : 0; 
    } 

private void drawText(String text, int textColor, int bckColor) { 
    TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG); 
    int max = Integer.MAX_VALUE; 
    String[] tokens = text.split("\n"); 
    for (String s : tokens) { 
     int m = determineMaxTextSize(s, params.width); 
     if (m > 0 && m < max) 
      max = m; 
    } 
    paint.setTextSize(max); 
    paint.setColor(textColor); 
    paint.setTextAlign(Paint.Align.CENTER); 
    Bitmap b = Bitmap.createBitmap(params.width + 1, params.height + 1, Bitmap.Config.ARGB_8888); 
    b.eraseColor(bckColor); 
    Canvas canvas = new Canvas(b); 
    Rect r = new Rect(); 
    int xPos = canvas.getWidth()/2; 
    int yPos = (canvas.getHeight()/2); 
    for (String s : tokens) { 
     if (s.equals("\n")) 
      s = " "; 
     paint.getTextBounds(s, 0, s.length(), r); 
     canvas.drawText(s, xPos, yPos, paint); 
     yPos += Math.abs(r.height()); 
    } 
    setImageBitmap(b); 
} 

Dieser Code funktioniert fast, aber der Text beginnt in der Mitte.

Antwort

1

Dies ist eine späte Antwort, also entschuldige ich mich, wenn es nicht mehr benötigt wird, aber nachdem ich nach einer Antwort gesucht habe, entschied ich mich, etwas Mathematik zu verwenden, um dieses Problem zu lösen.

Um meinen mehrzeiligen Text zu zentrieren, nehme ich die Breite der Zeichenfläche, subtrahiere die Breite des Textes und dividiere dann durch 2. Diese Zahl wird dann als x-Offset der drawText Methode verwendet.

Hier ist mein vollständiges Beispiel:

public static Bitmap textAsBitmap(String text, float textSize, int textColor, Context mContext) { 
    Paint paint = new Paint(ANTI_ALIAS_FLAG); 
    int pixel = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, textSize, mContext.getResources().getDisplayMetrics()); 

    String[] str = text.split(","); 

    paint.setTextSize(pixel); 
    paint.setTypeface(FontUtils.getRalewayExtraBold(mContext)); 
    paint.setColor(textColor); 
    paint.setTextAlign(Paint.Align.LEFT); 
    float baseline = -paint.ascent(); // ascent() is negative 
    int width = (int) (paint.measureText(text) + 0.0f); // round 

    int height = (int) (baseline + paint.descent() + 0.0f); 
    Bitmap image = Bitmap.createBitmap((width/str.length)+10, (height*str.length), Bitmap.Config.ARGB_8888); 

    Canvas canvas = new Canvas(image); 

    for (int i = 0; i < str.length; i++){ 
     //Center text here 
     float textOffset = (canvas.getWidth()-paint.measureText((str[i])))/2; 
     canvas.drawText(str[i], textOffset, ((i+1)*baseline), paint); 
    } 

    return image; 
}