2017-01-22 11 views
1

私はすべてのスペースをカバーするために、テキストサイズを調整して、縦横の中央に配置されたビットマップでテキストを描画する必要があります。問題は、テキストが\nの複数行であることです。これは現在のコードです:キャンバスdrawtext複数行を中心に

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

このコードはほとんど動作しますが、テキストは中央から始まります。

答えて

1

これは遅れているので、私はそれがもはや必要ではないが、答えを探した後、この問題を解決するためにいくつかの数学を採用することにしました。

複数のテキストを中央に配置するために、キャンバスの幅を取り、テキストの幅を減算して2で割ります。この数値はdrawTextメソッドのxオフセットとして使用されます。ここで

は私の完全な例です:

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; 
} 
関連する問題