首页 > 解决方案 > 根据字体大小对所有 TextView 使用 paddingBottom

问题描述

我在我的应用程序中使用了一种名为 Barlow 的自定义字体。但是,我需要bottomPadding在每个中指定 a,TextView因为字体不是垂直居中的。这是我所做的:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    ...
    <item name="android:textViewStyle">@style/Widget.Comblat.TextView</item>
    <item name="textAppearanceBody1">@style/TextAppearance.Comblat.Body1</item>
    <item name="textAppearanceHeadline3">@style/TextAppearance.Comblat.H3</item>
    ...
</style>

<!-- TextView -->
<style name="Widget.Comblat.TextView" parent="Widget.MaterialComponents.TextView">
    <item name="android:paddingBottom">1.6dp</item>
</style>

<!-- CustomFont -->
<style name="TextAppearance.Comblat.Body1" parent="TextAppearance.MaterialComponents.Body1">
    <item name="fontFamily">@font/mbarlow_condensed_regular</item>
    <item name="android:textStyle">normal</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:textSize">16sp</item>
    <item name="android:letterSpacing">0</item>
    <item name="android:includeFontPadding">false</item>
    <item name="android:textColor">@color/colorDarkPrimary60</item>
</style>


<style name="TextAppearance.Comblat.H3" parent="TextAppearance.MaterialComponents.Headline3">
    <item name="fontFamily">@font/mbarlow_condensed_semibold</item>
    <item name="android:textColor">@color/colorDarkPrimary</item>
    <item name="android:textStyle">normal</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:textSize">48sp</item>
    <item name="android:includeFontPadding">false</item>
    <item name="android:letterSpacing">-0.023</item>
</style>

这里我设置paddingBottom1.6dp. 但这仅适用于 Body1 字体(我的公式paddingBottom0.1*font_size),对于 H3 我想设置4.8dp.

有没有办法paddingBottom为所有 TextView 设置一个但取决于字体大小?我认为它可以通过编程方式或通过覆盖 TextView 来实现。当然,我可以在布局中的每个 TextView 上设置自定义样式,但是嘿,我是懒人

谢谢!

标签: androidfontstextview

解决方案


好吧,我创建了一个自定义 TextView,并将所有 TextView 替换为我自己的。

这是代码:

public class BarlowTextView extends MaterialTextView {
    public static final float RATIO_FONT_PADDING = 0.1f;
    private int dpAsPixels = 0;

    public BarlowTextView(@NonNull Context context) {
        super(context);
        float scale = getResources().getDisplayMetrics().density;
        dpAsPixels = (int) (getTextSize() * scale * RATIO_FONT_PADDING);
    }

    public BarlowTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        float scale = getResources().getDisplayMetrics().density;
        dpAsPixels = (int) (getTextSize() * scale * RATIO_FONT_PADDING);
    }

    public BarlowTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        float scale = getResources().getDisplayMetrics().density;
        dpAsPixels = (int) (getTextSize() * scale * RATIO_FONT_PADDING);
    }

    public BarlowTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        float scale = getResources().getDisplayMetrics().density;
        dpAsPixels = (int) (getTextSize() * scale * RATIO_FONT_PADDING);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        setPaddingRelative(0 , 0 , 0 , dpAsPixels);
    }
}

推荐阅读