android - 根据字体大小对所有 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>
这里我设置paddingBottom
为1.6dp
. 但这仅适用于 Body1 字体(我的公式paddingBottom
是0.1*font_size
),对于 H3 我想设置4.8dp
.
有没有办法paddingBottom
为所有 TextView 设置一个但取决于字体大小?我认为它可以通过编程方式或通过覆盖 TextView 来实现。当然,我可以在布局中的每个 TextView 上设置自定义样式,但是嘿,我是懒人
谢谢!
解决方案
好吧,我创建了一个自定义 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);
}
}
推荐阅读
- python - 3D绘图python中的轴缩放效果
- javascript - 如何在reactjs中解密url参数
- java - 试图从外部类对象调用内部类的方法
- r - 如何在R中将数据集从宽格式转换为长格式
- c++ - 当我将我的 C++ 文件拆分为 .h 文件和 .cpp 文件,然后 #include "xxx.h" 时,.cpp 文件中定义的函数无效
- ruby-on-rails - 按 Rails 中的多个主题过滤
- javascript - UseSelector State is Undefined
- excel - 创建唯一元素列表并显示由逗号和短划线解析的组成员身份
- unzip - 首次阅读后在 google colab 中解压缩会损坏
- ruby-on-rails - 多个域的 Rails 路由