安卓中的drawText包括文本换行

20

我正在制作一个图像编辑器,试图使用canvas.drawText()在图片上绘制文本。到目前为止,我已经成功地完成了这个任务,但是当用户输入过长的文本时,文本会在页面上继续一行,并且无法自动换行适应屏幕宽度。我该如何解决这个问题?我尝试使用静态布局来实现,但似乎无法使其正常工作,有没有人能提供一个教程来帮助我解决这个问题?

我的用于使用静态布局在画布上绘制文本的函数:

 public Bitmap createImage(float scr_x,float scr_y,String user_text){

            Canvas canvas = new Canvas(image);

            scr_x = 100;
            scr_y = 100;
            final TextPaint tp = new TextPaint(Color.WHITE);     
            canvas.save();
            StaticLayout sl = new StaticLayout("" + user_text, tp, originalBitmap.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
            sl.draw(canvas);

         return image;
        }

好的,我已经更新了代码,但是当我尝试在图像上绘制时,什么也没有发生,我不知道为什么:

    public Bitmap createImage(String user_text) {
    // canvas object with bitmap image as constructor
    Canvas canvas = new Canvas(image);
    TextPaint tp = new TextPaint();
    tp.setColor(Color.RED);
    tp.setTextSize(50);
    tp.setTextAlign(Align.CENTER);
    tp.setAntiAlias(true);
    StaticLayout sl = new StaticLayout("" + user_text, tp,
            canvas.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1, 0, false);
    canvas.translate(100, 100);
    sl.draw(canvas);
    return image;
}

StaticLayout不能在canvas上绘制吗?


请看下面这个回答,它对StaticLayout的良好使用示例:https://dev59.com/Omw15IYBdhLWcg3wMpEY#8369690 - Joshua Pinter
3个回答

17

请提供一个示例,因为StaticLayout没有直接绘制到Canvas的方法(而Canvas也没有draw(text.layout))。 - Marcos Vasconcelos
我的答案是正确的,但这不是最好的方法...只是让你看看这是多么不公平。 - Marcos Vasconcelos
我可以确认Marco的解决方案确实有效,我忘记在最后添加以下一行代码:iv_ttx.setImageBitmap(image)......谢谢Marco。 - Mustafa Nasser
2
这个答案完全没有帮助。 - IntoTheDeep

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

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

本文介绍在Android平台上如何将多行文本绘制到位图上。涉及到计算文本宽度、高度和换行,最后使用Canvas.drawText()方法进行绘制。同时也提供了一些代码示例和详细的解释。

-3

你应该自己处理它,计算文本大小并以某种方式包装内容(在最大宽度处断行或换行最后一个单词)。

我已经在Java SE上使用FontMetrics完成了这个任务,虽然没有在Android上做过,但你可以看一下:

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

如Lisa所指出,StaticLayout是测量文本换行的方法。

你是什么意思?我真的很困惑,因为我还很新。从阅读所有其他线程来看,StaticLayout方法似乎更受欢迎? - Mustafa Nasser
继承自View的组件在布局和测量调用之前不会绘制任何内容,您可能需要调用sl.measure(100,100,width,height)然后进行绘制。但是我知道可以通过测量字符宽度来包装内容。 - Marcos Vasconcelos
3
StaticLayout是专门用于呈现多行文本的,包括为您处理换行。在任何情况下,您都应该使用它来在Canvas上绘制文本,即使您“想直接调用Canvas.drawText()”。相信我,您不想自己进行行分割。http://developer.android.com/reference/android/text/StaticLayout.html - Lisa Wray
很高兴认识你,我只是不明白为什么要踩你的帖子,但还是感谢,对我也有所帮助。 - Marcos Vasconcelos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接