在画布上绘制多行文字

时间:2014-03-05 21:45:10

标签: java android 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());
    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;
}

它的工作原理与背景图像一样,文本也是如此,除了文本对于屏幕太长,我需要以某种方式包装它。

然后我查看了TextPaintStaticLayout来处理此代码的多行问题。

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

这根本不起作用。我的背景图像现在已经消失了,它显示为什么都没有。以前的文字没有居中。唯一的好处是文本现在是多行的。

有谁知道为什么文本改变了它的初始起点以及为什么画布的背景图像消失了?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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