Java 在画布顶部绘制多行文字

Java 在画布顶部绘制多行文字,java,android,canvas,android-bitmap,Java,Android,Canvas,Android Bitmap,因此,我首先从以下代码开始: private Bitmap writeTextOnDrawable(int drawableId, String text) { Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId); Bitmap alteredBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());

因此,我首先从以下代码开始:

private Bitmap writeTextOnDrawable(int drawableId, String text) {

    Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId);
    Bitmap alteredBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    Paint paint = new Paint();
    canvas.drawBitmap(bm, 0, 0, paint);
    paint.setColor(Color.WHITE); 
    paint.setTextSize(150f); 
    canvas.drawText(text, 100, 1000, paint); 

    return alteredBitmap;
}
它的工作正如预期的那样,背景图像在那里,文本也在那里,只是文本对于屏幕来说太长了,我需要以某种方式包装它

然后我查看了
TextPaint
StaticLayout
以处理此代码的多行问题

private Bitmap writeTextOnDrawable(int drawableId, String text) {

    Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId);
    Bitmap alteredBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    TextPaint tp = new TextPaint();
    canvas.save();
    tp.setColor(Color.WHITE);
    tp.setTextSize(150f);
    tp.setTextAlign(Align.CENTER);
    tp.setAntiAlias(true);
    StaticLayout sl = new StaticLayout("" + text, tp,
            canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
    canvas.translate(100, 1000);
    sl.draw(canvas);

    return alteredBitmap;
}
这根本不起作用。我的背景图像现在不见了,它毫无意义地显示出来。这篇文章没有居中,就像以前一样。唯一的好处是文本现在有多行


有人知道为什么文本改变了初始起点,为什么画布上的背景图像消失了吗?任何帮助都将不胜感激。

由于canvas.translate()函数,您的文本从初始起点开始移动。我不知道为什么你的背景图像消失了,因为你从来没有提到位图在哪里(如何)使用。如果希望文本显示在视图的左上角,下面是一个示例

创建ImageView(iv)并将其位图设置为:

iv.setImageBitmap(writeTextOnDrawable(drawableId, text));
现在,您的功能:

private Bitmap writeTextOnDrawable(int drawableId, String text) {

    Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId);
    // Create your ImageView-size bitmap
    Bitmap alteredBitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), bm.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    TextPaint tp = new TextPaint();
    tp.setColor(Color.WHITE);
    tp.setTextSize(24);
    tp.setAntiAlias(true);
    StaticLayout sl = new StaticLayout(text, tp,
        iv.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
    sl.draw(canvas);

    return alteredBitmap;
}

之后,您应该会在背景图像上看到多行文字。

正确。这是因为在onCreate()中,布局的视图尚未布局,因此它们的宽度和高度=0。只有在视图布局完成后,才应调用iv.setImageBitmap(writeTextOnDrawable(drawableId,text))。查看使用imageView的位置而不是按钮。@Will Jamieson显然,由于您遇到此错误,无论您是动态创建imageView,您的imageView宽度和高度在onCreate()中都为0。我相信,任何视图都是在onCreate()方法背后的某个点上显示出来的。在这一点之前,它的维度=0,当它发生变化时,一个很好的方法是使用ViewTreeObserver()。实际上,我从未尝试过设置某个值,比如说,视图高度,并在onCreate中检查它是否不是0。即使是这样,我认为这不是你需要的。