Android drawText including text wrapping Android drawText including text wrapping android android

Android drawText including text wrapping


Yes, StaticLayout is what you're meant to use to draw multi-line text on a Canvas. Save yourself a world of pain and don't think about breaking text yourself -- you're on the right path.

I'm not sure about the bitmap problem, but your second code above worked just fine to draw text on a canvas for me.

Learn to use StaticLayout , then draw the Layout object onto a canvas using the Layout.draw() method.

References


public Bitmap drawMultilineTextToBitmap(Context gContext,                                   int gResId,                                   String gText) {  // prepare canvas  Resources resources = gContext.getResources();  float scale = resources.getDisplayMetrics().density;  Bitmap bitmap = BitmapFactory.decodeResource(resources, gResId);  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 antialiased Paint  TextPaint paint=new TextPaint(Paint.ANTI_ALIAS_FLAG);  // text color - #3D3D3D  paint.setColor(Color.rgb(61, 61, 61));  // text size in pixels  paint.setTextSize((int) (14 * scale));  // text shadow  paint.setShadowLayer(1f, 0f, 1f, Color.WHITE);  // set text width to canvas width minus 16dp padding  int textWidth = canvas.getWidth() - (int) (16 * scale);  // init StaticLayout for text  StaticLayout textLayout = new StaticLayout(    gText, paint, textWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);  // get height of multiline text  int textHeight = textLayout.getHeight();  // get position of text's top left corner  float x = (bitmap.getWidth() - textWidth)/2;  float y = (bitmap.getHeight() - textHeight)/2;  // draw text to the Canvas center  canvas.save();  canvas.translate(x, y);  textLayout.draw(canvas);  canvas.restore();  return bitmap;}

source : http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/


You should handle it yourself, calculating the text size and wrapping the content in some way (break line at max width or wrap last word).

I already did it on Java SE with the FontMetrics, never for Android; but you should take a look:

http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html

As pointed by Lisa, StaticLayout is the way to go to measure text wrapping.