Составной текст, содержащий настраиваемый вид
Возможно ли добавить пользовательское представление в составной текст?
В
android.text.style
package Я могу видеть многие типы связанных объектов, но мне интересно, могу ли я добавить настраиваемое представление.
Вроде, как бы, что-то вроде
spanable.setSpan(CustomView, .. , .. ,..)
Обратите внимание: CustomView может быть любым видом, например:
WebView
2 ответа
В Android только
ViewGroup
класс может содержать другое представление, поэтому будет уместно сказать,
Возможно ли добавить расширяемый текст в настраиваемое представление?
Тогда ответ - Да, если ваше пользовательское представление расширяется
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
непосредственно, этот код будет хорошим началом, если вы хотите создать настраиваемый класс spannable, который отображает различные вещи больше, чем существующие классы 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