包含自定义视图的可扩展文本

问题描述

是否可以将自定义视图添加到可扩展的文本中?

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

spanable.setSpan(CustomView,..,..)的排序

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

解决方法

在Android中,只有ViewGroup类可以包含另一个视图,因此说起来很合适

是否可以在自定义视图中添加跨栏文本?

如果您的自定义视图扩展了ViewGroup类,答案是

但是,如果要绘制具有跨度的特定图形或动画,则需要直接从自定义视图上绘制Canvas

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

@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方法,可直接在Drawable上绘制Canvas,如果您要创建自定义的可扩展类,该类比现有的SDK显示更多内容,则此代码将是一个很好的开始课程。

,

因此,看起来似乎很难使用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