Android画布上的文字自动换行问题

4

我正在尝试将一些字符串写入画布(动态壁纸),但是长字符串不会自动换行,有没有什么方法可以实现自动换行?
我认为画布是唯一可用的工具,因为这是一个动态壁纸。


神啊,这不可能简单吧。有什么例子可以分享吗? - Luis M
2个回答

11

无需自己进行文字换行处理。

可以查看 android.text.Layout 及其子类 android.text.StaticLayout 和 android.text.DynamicLayout。

例如:

StaticLayout layout = new StaticLayout(text, txtpaint, textW,Layout.Alignment.ALIGN_NORMAL, 1.3f, 0, false);
txtcanvas.translate(xoffs, yoffs); //position the text
layout.draw(txtcanvas);

我不确定这会不会起作用 - 根据文档:DynamicLayout是一个文本布局,它会在文本被编辑时自动更新。小部件使用它来控制文本布局。除非您正在实现自己的小部件或自定义显示对象,或需要直接调用Canvas.drawText(),否则您不应该直接使用此类。 如果是这种情况,那么这将无法工作,因为在使用画布时需要调用Canvas.drawText()。 - ekatz
1
它会运行。实现自己的自定义小部件正是这个问题的重点。在进行格式化后,layout.draw 可能会为您调用 Canvas.drawText。请注意,在 draw 调用中发送画布。 - Olof Hedman
Olof,我知道SO的评论区不是用来点赞的,但非常感谢你的回答,省去了我数小时寻找正确工具的时间。对于其他人,是的,这个方法可行。 - andreimarinescu

0

不确定这对你是否有用,但对于这些情况,我真的很喜欢简单地创建一个视图,布局它,然后将其“截屏”成位图。

此函数将从参数和“just_a_textview”中的xml布局创建位图。

private static Bitmap renderTextIntoBitmap(Context context, Bitmap.Config bitmapConfig, String text, int textColor, int maxTextWidth) {
    LayoutInflater inflater = LayoutInflater.from(context);
    TextView tv = (TextView) inflater.inflate(R.layout.just_a_textview, null);
    tv.setText(text);
    tv.setMaxWidth(maxTextWidth);

    int widthSpec = View.MeasureSpec.makeMeasureSpec(maxTextWidth, View.MeasureSpec.EXACTLY);
    int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);

    tv.measure(widthSpec, heightSpec);
    tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
    tv.setTextColor(textColor);

    Bitmap bitmap = Bitmap.createBitmap(tv.getWidth(), tv.getHeight(), bitmapConfig);
    Canvas canvas = new Canvas(bitmap);
    tv.draw(canvas);
    return bitmap;
}

你不想在每帧都这么做,但一旦你有位图,将其绘制到画布上非常快速。这为你提供了任何 Android 视图的所有灵活性。
我明白如果你的文本非常动态,这种方法可能行不通,但你可以尝试这样做,并使用画布矩阵来进行缩放/旋转等任何想要进行的操作。这当然可以进一步优化性能,例如通过拉出布局膨胀。

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