检测Android的TextView将插入换行符的位置

时间:2014-10-14 16:10:24

标签: android textview multiline

我有一个矩形瓷砖,我想在其中放入一个图像和一些文字。图像不得与文本重叠,图像和文本的大小可能会有所不同。

流程必须手动编码,因为我们必须根据客户的需求对其进行微调。

我尝试了首先使用getTextBounds()measureText()测量渲染文本范围,然后调整字体大小和图像大小以使它们不重叠的方法。

如果文本只在一行上,这样可以正常工作。

但如果TextView将文本包装到多行,我就无法预测文本范围,因为我不知道TextView会在哪里插入自动换行符。

如何找出TextView插入自动换行符的文字中的位置?

示例:给定文字

Lorem ipsum dolor sit amet

将呈现为

| Lorem ipsum    |
| dolor sit amet |

我需要一个转换

的函数

Lorem ipsum dolor sit amet

Lorem ipsum \ndolor sit amet

2 个答案:

答案 0 :(得分:6)

TextView(布局对象)为您要完成的任务提供了一些有用的功能:

http://developer.android.com/reference/android/text/Layout.html

看看:

getLineCount()

getLineEnd(int line)

您可以根据字符在每个lineEnd的位置获取TextView字符串的子字符串。

您需要使用getViewTreeObserver()等待TextView被绘制,然后才能调用它们并从中获取有用的信息。

或者,您可以构建一个自定义TextView,它可以通过内置方法或通过向其添加侦听器来提供数据。修改文本大小的自定义TextView示例如下:

android ellipsize multiline textview

我已经使用过它并进行了类似的修改(就像你要做的那样)。

答案 1 :(得分:4)

您可能希望将此逻辑包装到自定义视图中(覆盖onSizeChanged()),但您可以使用Layout类来检查每行的结束位置:

textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Remove immediately so it only fires once
        textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        // View should be laid out, including text placement
        final Layout layout = textView.getLayout();
        float maxLineWidth = 0;

        // Loop over all the lines and do whatever you need with
        // the width of the line
        for (int i = 0; i < layout.getLineCount(); i++) {
            maxLineWidth = Math.max(maxLineWidth, layout.getLineWidth(i));
        }
    }
});