Используйте paddingBottom для всех TextView в зависимости от размера шрифта - PullRequest
0 голосов
/ 27 марта 2020

Я использую в своем приложении собственный шрифт Barlow. Однако мне нужно указать bottomPadding в каждом 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>

Здесь я установил paddingBottom на 1.6dp. Но это работает только для шрифта Body1 (моя формула для paddingBottom равна 0.1*font_size), для H3 я хотел бы установить 4.8dp.

Есть ли способ установить paddingBottom для все TextView, но в зависимости от размера шрифта? Я предположил, что это возможно программно или путем переопределения TextView. Конечно, я мог бы установить собственный стиль для каждого TextView в моих макетах, но, эй, я ленивый, ребята

Спасибо!

1 Ответ

0 голосов
/ 27 марта 2020

Итак, я создал собственный 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...