问题描述
在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