持有自定义视图的可跨文本
Spannable text that holding custom view
是否可以将自定义视图添加到可跨越文本中?
在 android.text.style
包中我可以看到很多类型的 spannable 对象,但我想知道我是否可以添加自定义视图。
有点像spanable.setSpan(CustomView, .. , .. ,..)
请注意:CustomView 可能是任何类型的视图,即:WebView
在Android中,只有ViewGroup
class可以包含另一个视图,所以说得对,
是否可以将可跨越文本添加到自定义视图中?
那么答案是 是,如果您的自定义视图扩展 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
是否可以将自定义视图添加到可跨越文本中?
在 android.text.style
包中我可以看到很多类型的 spannable 对象,但我想知道我是否可以添加自定义视图。
有点像spanable.setSpan(CustomView, .. , .. ,..)
请注意:CustomView 可能是任何类型的视图,即:WebView
在Android中,只有ViewGroup
class可以包含另一个视图,所以说得对,
是否可以将可跨越文本添加到自定义视图中?
那么答案是 是,如果您的自定义视图扩展 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