【问题标题】:Building a custom span that occupies the full width of the container构建一个占据容器全宽的自定义跨度
【发布时间】:2016-07-17 23:08:22
【问题描述】:

我需要创建一个自定义的Span,以像源代码一样呈现其内容。这是我要实现的目标的示例。假设我们有以下文本,其中我使用方括号注释了自定义跨度的开始和结束:

Some text [some\nmulti line\ntext] some more text

前缀(“Some text”)和后缀(“some more text”)应该正常渲染,但是自定义span应该像代码块一样渲染:

some
multi line
text

我一直在考虑为此使用ReplacementSpan,因为我之前曾使用它来创建各种有趣的自定义跨度,但对于这种情况,我无法让它做我想做的事情。

不知何故,我需要让我的 span 来渲染一个完整的图形块,占据容器的整个宽度。甚至有可能做到这一点吗?

【问题讨论】:

  • 使用android.text.style.LineBackgroundSpan
  • @pskink 我已经尝试过了,但是虽然这可以让我绘制背景,但它会将我的跨度分成三个单独的绘制调用(我假设换行符会导致源文本被分割成甚至在LineBackgroundSPan 有机会查看文本之前就将字符串分开)?
  • 是的,它“将您的跨度分解为三个单独的绘图调用”,这有什么问题?你想在“draw”方法中实现什么?
  • textview.setSingleLine(false); textview.setText("some\n"+"多行\n"+"text");
  • @pskink 这是一个问题,因为我想在整个块周围绘制一个框。

标签: android spannablestring spannable


【解决方案1】:

Android 逐行处理多行跨越。 我发现的唯一方法是覆盖TextView.onDraw,为每个块跨度组合块并在TextView.onDraw之前(或之后,如果你愿意)绘制它们。

这是一个示例活动 https://github.com/Babay88/AndroidCodeSamplesB/blob/master/blockquotespanexample/src/main/java/ru/babay/blockquotespanexample/MainActivity.java

它使用自定义的 TextView https://github.com/Babay88/AndroidCodeSamplesB/blob/master/blockquotespan/src/main/java/ru/babay/blockquotespan/TextViewWithBlockBackgrounds.java

还有特殊的 BlockQuoteSpan。

您应该确保每个块跨度都以\n 开头和结尾。

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2020-11-05
    相关资源
    最近更新 更多