8

我正在编写一个自定义布局来管理文本。在我开始实现该ViewGroup#onMeasure()方法之前,我开始挖掘 EditText 源代码,特别是该EditText#onMeasure()方法。所以我遇到了 BoringLayout. 我阅读了文档,但没有找到太多关于它的解释以及如何在实际的自定义实现中使用它。然后我的问题是如何以正确的方式使用它以及何时真正需要它。

4

2 回答 2

16

BoringLayout用于在视图上绘制文本。它被称为“无聊”,因为它只处理一行从左到右的文本,没有任何有趣的字符,例如表情符号。这种简化允许类onDraw使用比默认更有效的逻辑覆盖。如果您想亲自查看,这里是源代码。

StaticLayoutand一样DynamicLayoutBoringLayout也是抽象类的子Layout类。正如文档所说,除非您正在制作自己的文本处理小部件,否则您可能不会直接使用这些类。你怎么知道你是否应该使用这些类之一?如果您正在考虑Canvas.drawText在自定义视图中使用,那么您可能应该考虑使用Layout. 他们最终也调用Canvas.drawText,但他们事先做了很多其他处理。

如果您正在制作自己的文本小部件,那么您将只使用BoringLayout单行、简单、从左到右的文本。对于多行和更复杂的文本,请使用StaticLayout. 如果您需要在创建后动态更改文本,则使用DynamicLayout.

于 2017-01-19T10:23:20.477 回答
1

从技术上讲,您可以使用 `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);
    }
于 2015-05-26T08:51:04.200 回答