lineSpacingMultiplier导致按钮文本不居中

时间:2019-01-28 17:11:38

标签: android android-layout

在运行API 19的设备上,我注意到属性lineSpacingMultiplier导致文本在Button内部未垂直居中。即使只有一行文本,它似乎仍在应用间距乘数。

我的应用主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="fontFamily">@font/trade_gothic_ltstd</item>
    <item name="android:lineSpacingMultiplier">1.3</item>
</style>

我得到的。请注意,此按钮没有任何填充,从lineSpacingMultipler删除styles.xml会使按钮正确居中。

Incorrectly centered button

有人知道如何解决此问题吗?我尚未确切确认它可以正常运行的Android版本,但是从我所见,这在API 26及更高版本上不是问题。

2 个答案:

答案 0 :(得分:1)

默认情况下,API 19上的

Line Multiplier会添加空格,即使行数不超过1个也是如此。这是API 19中存在的问题。

答案 1 :(得分:0)

我无法验证这是否可以解决问题,但是我相信您现在可以使用TextView的子类来解决此问题,该子类缓存所需的行距乘数,但仅基于选择性地应用它布局遍历完成后,根据实际布局中的行数计算。

public final class LineSpacingTextView extends AppCompatTextView {
    public LineSpacingTextView(@NonNull Context context) {
        super(context);
    }

    public LineSpacingTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        Layout layout = getLayout();
        if (layout != null) {
            adjustLineSpacing(layout);
        }
    }

    @Override
    public void setLineSpacing(float add, float mult) {
        // Cache the last specified line spacing as we may overwrite it
        // when the view is laid out.
        desiredLineSpacingMultiplier = mult;
        Layout layout = getLayout();
        if (layout != null) {
            adjustLineSpacing(layout);
        } else {
            super.setLineSpacing(add, mult);
        }
    }

    private float adjustLineSpacing(@NonNull Layout layout) {
        // Force line spacing to 1 if the layout has only one line.
        float adjustedLineSpacingMultiplier = 
                layout.getLineCount() == 1
                ? 1f
                : desiredLineSpacingMultiplier;

        // Only set if changed, as this may be called recursively from
        // setLineSpacing otherwise.
        if (getLineSpacingMultiplier() != adjustedLineSpacingMultiplier) {
            super.setLineSpacing(getLineSpacingExtra(), adjustedLineSpacingMultiplier);
        }
    }
}