我需要一种方法将文本分成像TextView这样的行。我看到TextView使用Dynamic - / Static - / BoringLayout来执行此操作。
有了这些信息,我编写了自己的方法,但文本中断不一样。如果fontsize非常小,则行长: - (
public static String ellipsize(final String text, final TextAppearanceSpan textAppearance, final int avail, final int maxLines) {
if (TextUtils.isEmpty(text)) {
return null;
}
final StringBuilder builder = new StringBuilder();
final TextPaint paint = new TextPaint();
paint.setTextSize(textAppearance.getTextSize());
paint.setTypeface(Typeface.create(textAppearance.getFamily(), textAppearance.getTextStyle()));
final float ellipsisWidth = paint.measureText("\u2026");
final StaticLayout layout = new StaticLayout(text, paint, avail, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true);
final int lineCount = layout.getLineCount();
final int lines = lineCount < maxLines ? lineCount : maxLines;
for (int i = 0; i < lines; i++) {
final int lineStart = layout.getLineStart(i);
final int lineEnd = layout.getLineEnd(i);
String substring = text.substring(lineStart, lineEnd);
if ((i == (maxLines - 1)) && (lineCount > maxLines)) {
final int nextLineStart = layout.getLineStart(i + 1);
final int nextLineEnd = layout.getLineEnd(i + 1);
final String nextSubstring = text.substring(nextLineStart, nextLineEnd);
final String lastLine = substring.concat(nextSubstring);
substring = TextUtils.ellipsize(lastLine, paint, avail - ellipsisWidth, TextUtils.TruncateAt.END, true, null).toString();
}
builder.append(substring);
}
return builder.toString();
}
答案 0 :(得分:1)
看起来无法创建我自己的TextPaint对象,该对象看起来像TextView中的对象。
现在我从TextView复制TextPaint对象并更改文本大小和字体。
我认为它现在正在运作。
/**
* Returns the original text if it fits in the specified width (<code>avail</code>) with
* the properties of the specified TextAppearanceSpan (<code>textAppearance</code>), or,
* if it does not fit, a truncated copy with ellipsis character added at the end
* (<code>TextUtils.TruncateAt.END</code>).
*
* @param paint
* the TextPaint from the TextView
* @param text
* the text to truncated
* @param textAppearance
* text typeface, size, and style
* @param avail
* the available width
* @param maxLines
* maximum number of displayed lines
* @return the original text or a truncated copy
* @see TextView#getPaint()
* @see TextAppearanceSpan
* @see TextUtils.TruncateAt#END
*/
public static String ellipsize(final TextPaint paint,
final String text,
final TextAppearanceSpan textAppearance,
final int avail,
final int maxLines) {
if (TextUtils.isEmpty(text)) {
return null;
}
final StringBuilder builder = new StringBuilder();
paint.setTextSize(textAppearance.getTextSize());
paint.setTypeface(Typeface.create(textAppearance.getFamily(), textAppearance.getTextStyle()));
final StaticLayout layout = new StaticLayout(text, paint, avail, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
final int lineCount = layout.getLineCount();
final int lines = lineCount < maxLines ? lineCount : maxLines;
for (int i = 0; i < lines; i++) {
final int lineStart = layout.getLineStart(i);
final int lineEnd = layout.getLineEnd(i);
String substring = text.substring(lineStart, lineEnd);
if ((i == (maxLines - 1)) && (lineCount > maxLines)) {
final String lastLine = substring.concat("\u2026");
substring = TextUtils.ellipsize(lastLine, paint, avail, TextUtils.TruncateAt.END, true, null).toString();
}
builder.append(substring);
}
return builder.toString();
}