19

我目前正在创建一个图像编辑器,并尝试使用 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 不是用来在画布上绘制的吗?

4

3 回答 3

16

是的,这StaticLayout 您用来在Canvas. 为自己节省一个痛苦的世界,不要考虑自己破坏文本——你走在正确的道路上。

我不确定位图问题,但是您上面的第二个代码可以很好地为我在画布上绘制文本。

学习使用StaticLayout,然后使用方法将 Layout 对象绘制到画布Layout.draw()上。

参考

于 2013-08-29T20:10:10.650 回答
6
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/

于 2016-09-21T11:14:53.860 回答
-3

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

我已经在 J​​ava SE 上使用 FontMetrics 做到了,从来没有在 Android 上做过;但你应该看看:

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

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

于 2013-08-26T22:22:28.373 回答