2013-09-23 3 views
2

Мне нужен способ разбить текст на строки, такие как TextView. Я видел, что TextView использует Dynamic -/Static -/BoringLayout s для этого.Как Android TextView разбивает текст на строки?

С помощью этой информации я написал свой собственный метод, но разрывы текста не совпадают. Если 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

Я думаю, вы должны смотреть на EditText из исходного кода Android, а й начиная с TextView. Поэтому, возможно, вам придется расширить EditText в соответствии с вашими потребностями. –

ответ

1

Похоже, что невозможно создать свой собственный объект TextPaint, который выглядит как один из TextView.

Так что теперь я копирую объект TextPaint из TextView и изменить размер текста и начертание шрифта.

Я думаю, что сейчас он работает.

/** 
* 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(); 
} 
+0

'текст = MyTextUtils.ellipsize ( .getPaint(), текст, , .getWidth(), );' –

+0

Где ты заботиться о "Составной" во всем этом коде? – Ashwin

Смежные вопросы