自定义 Spannable = ImageSpan + BackgroundColorSpan + ClickableSpan

Posted

技术标签:

【中文标题】自定义 Spannable = ImageSpan + BackgroundColorSpan + ClickableSpan【英文标题】:Custom Spannable = ImageSpan + BackgroundColorSpan + ClickableSpan 【发布时间】:2012-03-19 22:29:46 【问题描述】:

我想要一个自定义的Spannable 类,它以某种方式结合了ImageSpanBackgroundColorSpanClickableSpan 的行为。所以基本上类似于labels or bubbles 加上一个点击处理程序。或者换句话说:我需要在一个单词前面放置一个图标,并在该单词后面绘制一个自定义背景。我浏览了ReceipentEditor 和other classes,但还没有找到最终的提示。

我试图通过扩展 DynamicDrawableSpan 来完成这一点,但这会替换文本,我不想手动绘制文本。实现这种自定义Spannable 的最佳方法是什么?或者有没有更好的方法不使用Spannables?任何提示或提示表示赞赏!

【问题讨论】:

我在这里做类似的事情***.com/questions/10812316/contact-bubble-edittext @toobsco42 这正是我想要的。您也遇到了与我相同的问题;)从我目前看到的情况来看,您似乎需要渲染文本才能覆盖背景可绘制对象。 您究竟如何渲染文本以​​覆盖背景可绘制对象? @toobsco42 到目前为止我还没有这样做。但我猜你需要扩展BitmapDrawable 并覆盖draw()。在那里你可以访问Canvas.drawText()。棘手的部分可能是找出正确的字体和文本大小。 我遇到了this tutorial,这正是我所需要的。希望对你也有帮助。 【参考方案1】:

我实现了类似的东西。在我的实现中,单击气泡将删除它。为此,我只对 TextView 使用 ImageSpan。然后在 TextView 中添加一个 OnClickListener。

在 OnClickListener 内部,使用 getSelectionStart() 获取光标位置。确定该位置与哪个 ImageSpan 相关联。在没有 ImageSpan 条目的情况下重建并重绘 TextView。

【讨论】:

我没有想到这一点 :-) 好吧,这可以解决。但实际上,拥有一个 componented Spannable 会更好,它消除了在覆盖的 TextView 中做事情的需要 如何将 ImageSpan 用于 EditText 视图?我试过这样: final Editable e = tv.getEditableText();最终 SpannableStringBuilder sb = new SpannableStringBuilder(); sb.append(文本); sb.setSpan(new ImageSpan(this, R.drawable.background_span), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);但是,“文本”中的字符跨度显示为不可见。我的 background_span.xml 是一个可绘制的形状。 我也尝试过收件人编辑器课程。但我的问题是,如果我的编辑文本中有更多筹码,我将添加额外文本。所以这个计数在高端设备中重复。如果我为额外的 2 个联系人添加了 +2。它将在高端设备中实现 +2+2.. @radium22

以上是关于自定义 Spannable = ImageSpan + BackgroundColorSpan + ClickableSpan的主要内容,如果未能解决你的问题,请参考以下文章

Android 自定义 View 中使用 Spannable

Android 自定义 View 中使用 Spannable

ImageSpan

[bug修复方案分享]ImageSpan居中问题

在TextView中设置文本自定义

IM项目中的自定义小表情实现