我有一个矩形瓷砖,我想在其中放入一个图像和一些文字。图像不得与文本重叠,图像和文本的大小可能会有所不同。
流程必须手动编码,因为我们必须根据客户的需求对其进行微调。
我尝试了首先使用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
答案 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));
}
}
});