Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Center text on a bitmap

I'm trying to draw a text on the center of a bitmap however I can't do it even though I used align.center. The code is:

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

What am I doing wrong?

like image 987
Luís Jesus Avatar asked Mar 28 '12 15:03

Luís Jesus


2 Answers

It's a lot more straightforward than you think.

Draw the text at half the Bitmap's width and height (center point) in combination with Paint.setTextAlign(Align.CENTER).

The alignment property will take care of the rest.

like image 114
Che Jami Avatar answered Oct 13 '22 03:10

Che Jami


I guess none of the answers given above are good enough so I post my answer. Try it out guys, it will work on all devices and is not complex at all:

    String text = "Text"; //your string
    Canvas canvas = new Canvas(bitmap);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(activity.getResources().getColor(R.color.white));
    paint.setTextSize(30);

    // draw text to the Canvas center
    Rect boundsText = new Rect();
    paint.getTextBounds(text, 0, text.length(), boundsText);
    int x = (bitmap.getWidth() - boundsText.width()) / 2;
    int y = (bitmap.getHeight() + boundsText.height()) / 2;

    canvas.drawText(text, x, y, paint);
like image 34
user1530779 Avatar answered Oct 13 '22 03:10

user1530779