持有自定义视图的可跨文本

Spannable text that holding custom view

是否可以将自定义视图添加到可跨越文本中?

android.text.style 包中我可以看到很多类型的 spannable 对象,但我想知道我是否可以添加自定义视图。

有点像spanable.setSpan(CustomView, .. , .. ,..)

请注意:CustomView 可能是任何类型的视图,即:WebView

在Android中,只有ViewGroupclass可以包含另一个视图,所以说得对,

是否可以将可跨越文本添加到自定义视图中?

那么答案是 ,如果您的自定义视图扩展 ViewGroup class.

但是,如果您想使用 spannable 绘制特定图形或动画,则需要直接从您的自定义视图在 Canvas 上绘制。

例如,如果您检查 android.text.style 包中的 DynamicDrawableSpan class。

@Override
public void draw(@NonNull Canvas canvas, CharSequence text,
        @IntRange(from = 0) int start, @IntRange(from = 0) int end, float x,
        int top, int y, int bottom, @NonNull Paint paint) {
    Drawable b = getCachedDrawable();
    canvas.save();

    int transY = bottom - b.getBounds().bottom;
    if (mVerticalAlignment == ALIGN_BASELINE) {
        transY -= paint.getFontMetricsInt().descent;
    } else if (mVerticalAlignment == ALIGN_CENTER) {
        transY = (bottom - top) / 2 - b.getBounds().height() / 2;
    }

    canvas.translate(x, transY);
    b.draw(canvas);
    canvas.restore();
}

它有 draw 直接在 Canvas 上绘制 Drawable 的方法,如果你想创建显示的自定义 spannable class,这段代码将是一个很好的开始比现有 SDK classes.

多了很多东西

所以看起来使用 Spannable 方式来处理这种情况会很有挑战性。

因此我创建了一个 new library 来处理标签,这样我就可以在任何需要的地方使用它们。

这是一个例子

HtmlParser.Builder(StringSource(source)).setCallback(object : HtmlParser.ParserCallbacks {
override fun onParseFinished(list: List<Element>) {
list.forEach {
        Log.d(TAG, "onParseFinished: ${ElementType.values()[it.type]} ||| ${it.toString()}")
    if (it is ImageElement) {
        Log.d(TAG, "onImageFound: $it ||| ${it.ImageUrl}")
    } else if (it is IFrameElement) {
        Log.d(TAG, "onIFrameFound: $it ||| ${it.url}")
    } else if (it is BlockQuoteElement) {
        Log.d(TAG, "onBlockQuoteFound: ${it.data} ${it.text}")
    } else if (it is FigureElement) {
        Log.d(TAG, "onFigure: ${it.caption}  ${it.url}")
    }
 } 
 } override fun onParseError(exception: Exception) {}})
   .build()

现在我可以随心所欲地处理元素,即:RecycleView