检测TextView是否包装线

时间:2016-06-27 10:51:04

标签: java android textview textwrapping line-numbers

我们使用TableViews的ExpandableList来显示一侧带有行号的文本块。首先,将给定段落的字符串设置为TableView右列中的文本视图。然后,从段落字符串和起始行号生成行号字符串。例如,从字符串(起始行号为1):

Lorem ipsum dolor sit amet, 
consectetur adipiscing elit.   
Donec ultricies a nunc sit amet venenatis.   
Aenean placerat dictum nunc,   
nec pulvinar arcu consequat a.   
Proin dignissim velit ut augue dictum ultricies.  
Fusce lorem dolor, elementum id tempor at,   
pellentesque eu dolor. Vestibulum rhoncus   
arcu in sapien sagittis gravida.   
Nullam vel nisl enim.   
Maecenas scelerisque at quam non congue.   
Nullam quis porttitor purus, nec interdum tellus.   

生成以下行号字符串:

\n\n\n\n5.\n\n\n\n\n10.\n\n

然后将此字符串放在TableView的最左侧列中,以显示每五行的字符串行号。

然而,当文本大小被提升到包裹文本行的点时(因为行太大而不适合屏幕),会出现问题。当发生这种情况时,似乎有必要在文本换行的站点的行号字符串中插入另一个\ n,以便将包含文本的潜在多行计为单行。因此,无论如何,android都能检测到一行是否已经包装在TextView中,以便程序可以知道在行号字符串中插入\ n并补偿换行符吗?

1 个答案:

答案 0 :(得分:0)

首先,您可以计算字符串渲染所需的屏幕宽度。将其与您的整个设备/视图进行比较,以检查是否需要插入' \ n'用于文字包装。

PS:代码未经过测试但应该有效。如果您使用自定义字体,则可以将Typeface.DEFAULT替换为您自己的字体。

public float computeTotalWidthOnScreen(String text) {
        final Typeface typeface = Typeface.DEFAULT;
        final Paint paint = new Paint();
        final Rect bounds = new Rect();
        paint.setTypeface(typeface);
        paint.setAntiAlias(true);
        paint.setTextSize(defaultFontSize);
        paint.getTextBounds(text, 0, text.length(), bounds);

        return bounds.width();
    }