Android 中的字体大小适配

Android系统中可以设置字体大小,对于一些设置了特大号字体的设备,往往会出现布局错乱的情况,对此,需要做相关的字体大小适配。根据聊聊 Android 中的字体大小适配这篇博客提供的方案,进行了一些改进,找到了一种比较合适的方式,将字体大小控制在合理范围内。

以MIUI为例,系统中设置的字体大小对应的fontScale如下

巨无霸 1.4
超大 1.4
大号 1.32
中号 1.15
标准 1
小号 0.86

小号字体下,会比较精致,不作处理。对于大号字体,使其fontScale强制改为指定值,以解决布局错乱的情况。
封装为工具类如下

public class FontCompatUtils {
    public static final float MAX_FONT_SCALE = 1.10F; //可自行修改最大缩放值
    public static final String TAG = "FontCompatUtils";

    private static Float fontScalePercent = null;

    public static Resources getResources(Resources res) {
        Configuration configuration = res.getConfiguration();
        if (fontScalePercent == null) {
            fontScalePercent = 1 / configuration.fontScale;
        }
        if (shouldChangeFontScale(configuration)) {//非默认值
            Configuration newConfig = new Configuration();
            newConfig.setToDefaults();//设置默认
            //configuration.fontScale = MAX_FONT_SCALE;
            res.updateConfiguration(newConfig, res.getDisplayMetrics());
        }
        return res;
    }

    /**
     * 是否需要改变字体缩放级别
     *
     * @param configuration
     * @return
     */
    public static boolean shouldChangeFontScale(Configuration configuration) {
        return configuration.fontScale > MAX_FONT_SCALE;
    }

    /**
     * 字体缩放比例
     *
     * @return
     */
    public static Float getFontScalePercent() {
        if (fontScalePercent == null) {
            return 1F;
        }
        return fontScalePercent;
    }
}

然后,在Application和BaseActivity中,重写getResourcesonConfigurationChanged方法

@Override
public void onConfigurationChanged(Configuration newConfig) {
    if (FontCompatUtils.shouldChangeFontScale(newConfig))
        getResources();
    super.onConfigurationChanged(newConfig);
}

@Override
public Resources getResources() {
    return FontCompatUtils.getResources(super.getResources());
}

至此,我们就完成了字体大小的适配。

其他

更多适配方案,详见聊聊 Android 中的字体大小适配
屏幕适配方案详见 Android屏幕适配大全

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值