在运行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
会使按钮正确居中。
有人知道如何解决此问题吗?我尚未确切确认它可以正常运行的Android版本,但是从我所见,这在API 26及更高版本上不是问题。
答案 0 :(得分:1)
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);
}
}
}