【问题标题】:How does a Android TextView breaks the text into lines?Android TextView 如何将文本分成几行?
【发布时间】:2013-09-24 10:48:44
【问题描述】:

我需要一种将文本分成几行的方法,例如 TextView。我看到 TextView 使用 Dynamic- / Static- / BoringLayouts 来做到这一点。

有了这些信息,我编写了自己的方法,但文本中断不一样。如果字体大小真的很小,那么线条就会很长:-(

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();
}

【问题讨论】:

  • 我觉得你应该看Android源代码的EditText,而不是从TextView开始。因此,我相信您可能必须扩展 EditText 以满足您的需求。

标签: android android-layout textview


【解决方案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();
}

【讨论】:

  • text = MyTextUtils.ellipsize(&lt;TextView&gt;.getPaint(), text, &lt;TextAppearanceSpan&gt;, &lt;TextView&gt;.getWidth(), &lt;max lines&gt;);
  • 你在哪里处理所有这些代码中的“Spanned”?
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2012-12-19
  • 2019-06-05
  • 1970-01-01
相关资源
最近更新 更多