Удобство использования BoringLayout

Я пишу пользовательский макет, который будет управлять текстом. Прежде чем я начал реализацию ViewGroup#onMeasure() метод, который я начал копать исходный код EditText, особенно на EditText#onMeasure() метод. Итак, я наткнулся на BoringLayout, Я прочитал документы, но не нашел много объяснений и того, как их использовать в реальной пользовательской реализации. Тогда мой вопрос: как я могу использовать это правильно и когда это действительно необходимо.

2 ответа

Решение

BoringLayout используется для рисования текста в представлении. Он называется "скучный", потому что он обрабатывает только одну строку текста слева направо без каких-либо интересных символов, таких как эмодзи. Это упрощение позволяет классу переопределять onDraw с более эффективной логикой, чем по умолчанию. Вот исходный код, если вы хотите увидеть для себя.

подобно StaticLayout а также DynamicLayout, BoringLayout также подкласс абстрактного Layout учебный класс. Как говорится в документации, вы, вероятно, не будете использовать эти классы напрямую, если не создадите свой собственный виджет для обработки текста. Как вы знаете, если вы должны использовать один из этих классов? Если вы думаете об использовании Canvas.drawText в вашем обычном представлении, то вы, вероятно, должны подумать об использовании Layout, Они также в конце концов называют Canvas.drawText, но они делают много другой обработки заранее.

Если вы создаете свой собственный текстовый виджет, то вы будете использовать только BoringLayout для одной строки, простой текст слева направо. Для многострочного и более сложного текста используйте StaticLayout, И если вам нужно динамически изменить текст после создания, то используйте DynamicLayout,

Технически, вы можете рисовать текст на холсте с помощью `canvas.drawText("text");
Тем не менее, текст является очень общим термином и может быть чрезвычайно сложным: это LeftToRight или RightToLeft? это эллипсис? это один или несколько строк?...

android.text.Layout здесь, чтобы справиться со всем этим.

Типичный способ его использования:

        BoringLayout.Metrics boring = BoringLayout.isBoring(mText, mPaint);
    if (boring != null) {
        // this is boring !
        if (mSavedLayout != null) {
            mLayout = mSavedLayout.replaceOrMake(mText,
                    mPaint,
                    availableWidth,
                    Layout.Alignment.ALIGN_NORMAL,
                    SPACING_MULT,
                    SPACING_ADD,
                    boring,
                    true,
                    TextUtils.TruncateAt.END,
                    availableWidth);
        } else {
            mLayout = BoringLayout.make(mText,
                    mPaint,
                    availableWidth,
                    Layout.Alignment.ALIGN_NORMAL,
                    SPACING_MULT,
                    SPACING_ADD,
                    boring,
                    true,
                    TextUtils.TruncateAt.END,
                    availableWidth);
        }
        mSavedLayout = (BoringLayout) mLayout;
    } else {
        mLayout = new StaticLayout(mText,
                0,
                mText.length(),
                mPaint,
                availableWidth,
                Layout.Alignment.ALIGN_NORMAL,
                SPACING_MULT,
                SPACING_ADD,
                true,
                TextUtils.TruncateAt.END,
                availableWidth);
    }
Другие вопросы по тегам