Составной текст, содержащий настраиваемый вид

Возможно ли добавить пользовательское представление в составной текст?

В 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

Другие вопросы по тегам