1

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

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

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

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

4

2 回答 2

1

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

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

那么答案是Yes,如果您的自定义视图扩展ViewGroup类。

但是,如果您想使用 spannable 绘制特定的图形或动画,则需要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 类显示更多的东西,这段代码将是一个好的开始。

于 2020-09-17T02:38:42.177 回答
0

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

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

这是一个例子

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

于 2020-09-21T00:28:59.767 回答