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

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

Ответ 1

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

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

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

Примечание

Это старый вопрос, но другой ответ действительно не говорил о BoringLayout, поэтому, так как я изучал эту тему сегодня, я решил добавить еще один ответ.

Ответ 2

Технически вы можете нарисовать текст на холсте с помощью `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);
    }