2012-03-28 18 views
5

私はビットマップの中央にテキストを描画しようとしていますが、align.centerを使用してもできません。コードはビットマップの中央のテキスト

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

私は間違っていますか?

+1

このpaint.setTextAlign(Align.CENTER)を削除してください。このcanvas.drawText(gText、x * scale、y * scale、paint)を置き換えます。このcanvas.drawText(gText、x、y、paint)によって;これが助けてくれることを願って – Triode

答えて

12

あなたの考えるよりもはるかに簡単です。

Paint.setTextAlign(Align.CENTER)と組み合わせて、Bitmapの幅と高さ(中心点)の半分でテキストを描画します。

調整プロパティは残りの部分を処理します。

+0

うわー、この旗を知りませんでした。すごいヒント! – Anton

+0

すてきな答え:) – Madhu

0

テキストの図はどこですか?この問題は、テキストの整列をAlign.CENTERに変更したことが原因である可能性があります。 xとyを計算するあなたのコードは、テキストレンダリングがAlign.LEFTを使用していると仮定します。

setTextAlign(Align.CENTER)とレンダリングを実際のビットマップの中心で使用するか、setTextAlign(Align.LEFT)を使用して、使用している現在のxとyの計算を使用します。

1

私は上記の答えのどれも十分ではないと思いますので、私は答えを投稿します。試してみてください、それはすべてのデバイスで動作し、全く複雑ではありません:

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

これはほぼ正しいですが、 "i"、 "1"、 "。"、...のいずれにしても機能しません - これらは左に多くなり、 " - "では悲惨に失敗します中央より少し上に左上に表示されます)。 canvas.drawText(text、x-bounds.left、y-bounds.bottom、paint);を試してください。テキストは本当に真ん中にあります。 –

+0

xとyをdrawTextメソッドに渡すことが最善の方法です。ありがとう! – Azrael94

関連する問題