是否可以将自定义视图添加到可跨文本中?
在android.text.style
包中,我可以看到许多类型的可跨对象,但我想知道是否可以添加自定义视图。
有点spanable.setSpan(CustomView, .. , .. ,..)
请注意: CustomView 可能是任何类型的视图,即:WebView
是否可以将自定义视图添加到可跨文本中?
在android.text.style
包中,我可以看到许多类型的可跨对象,但我想知道是否可以添加自定义视图。
有点spanable.setSpan(CustomView, .. , .. ,..)
请注意: CustomView 可能是任何类型的视图,即:WebView
在 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 类显示更多的东西,这段代码将是一个好的开始。
所以看起来使用 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