在平常开发中,一般 App 的界面布局都只会适配规范字体的规范,假定用户在设置中修改了体系字号巨细,那么 App 的 UI 就有或许不忍目睹。

针对这种状况,许多 App 都会挑选扔掉运用体系字号,方法也很简略,直接在我们的 BaseActivity 中修改 fontScale:

    @TargetApi(17)
override fun getResources(): Resources {
val resources = super.getResources();
val configContext = createConfigurationConappetitetext(resources.c字体转换器onfigithub中文社区guration)
return configContext.resources.apply {
configuration.fontScale = 1.0f
displayMetricGitHubs.scaledDensity = displayMetrics.density * configuration.fontgithub中文官网网页Scale
}
}

在低版本中,我们还能这样设置,实测没啥问题,不过 updateConfiguration 方法已经处于扔掉状况:

    override fun getResources(): Resources {
return super.getResources().apply {
configuration.fontScale = 1.0f
updateConfiguration(configuraapp是什么意思tion, displayMetrics)
}
}

sp 转 dp

将 sp 改为 dp 也能够坚持字体缩放不变。

字体设计便说一嘴,标明规范时,sp 与dp 联络:字体规范100%时 1sp=1dp,而字体规范大于100%时,1sp 就会大于 1dp。

Android修炼系列(二十),由体系字号来调整 App 字体巨细

sp:与缩放无关的笼统像素,sp 与 dp 相同是物理像素,但 Android 体系容许用户自界说文字规范巨细,因而 sp 能appetite根据体系设置而呈现出不同效果,这或许就是规范里,文字规范要运用appointment sp 的原因吧。

dp:设备独立像素,它只与设备屏幕有关,所以 dp 标明的文字就不会字体巨细怎样调跟着体系字号的改动而改动了。但这样也会发生一个问题,假定 A字体设计ppandroid什么意思 本身没有内置字号调整功用,又不受体系字号影响,那么关于部分用户群体来说,是非常字体设计在线生成器不友好的。

字号缩放

通过上android的drawable类面的介绍,字号调整功用呼之欲出了,我们能够修改 configuration.fontScale 的值来界说字号的缩放倍数。

代码就不贴了,appetite运行了github中文官网网页字体是 ok 的。但是这样会发生一些问题:

  • 假定文字控件没有自适应高度,就会导致文字闪现不全;

  • fontScalegithub中文社区 只能修改字体巨细,其他 UI 元素不能随从改动,这点就很难接受了,因为设完后你会发现整个 UI 都变得不协调了。

针对这种情字体大全况,另一种很美妙的方案就应势而生了。

修改 density

  • dpi(每英寸的点数): 像素密度,是屏幕单位面积内的像素数。它与分辨率不同,分辨率是屏幕上的总像素数。

  • density: 其时像素密度指定将 dp 单位转换为像素时所有必要运用的缩gitee放系数,dens字体巨细怎样调ity = dpi/160,并且 px = dp * density。

有些笼统吧,再多说一嘴,咱github官网们都知道,android 支撑不同的像素密度 dpi 方式,具体见下:

Android修炼系列(二十),由体系字号来调整 App 字体巨细

举个栗子,由上面界说可知,在 hdpi 方式下:1dp=1giti.5px,也就是说设计师在 PS 里界说一个view 高 72px,开发就应该界说该 view 高 48dp,Photgithub官网oshop 中 21px 大的字体,开发会界说为 14sp(规范字体github直播渠道永久回家下,sp=dp)。

所以想一想,在 hdpi 方式下,假定我的 viewHeight=1dp,现在我不想 1dp=1.5px 了android手机,我想 1dp=1.75px 了,是不是等比例扩展 dpi 和 density 就能够了字体设计呢?这样界面的 UI 元素是不是也就android手机等比例适配了呢。BaseActivity 代APP码见下:

    private fun setDensity() {
val systemMetrics = getSystemMetrics()
val scale = 1.0f // 根据需求界说系数
with(resources.displayMetrics) {
density = systemMetrics.density * s字体识别cale
scaledDensity = systemMetrics.density * scale
densiapp是什么意思tyDpi = (systemMetrics.densit字体美化大师yDpi * scale).tAndroidoInt()
}
}
private fun getSystemMetrics(): DisplayMetrics {
return applicationContext.resources.displayMetri字体cs;
}

这儿的 scaledDenandroid下载sity 需求留神,是将 fontScale=1 状况处理了,android下载以适配 sp,当调整体系字体巨细时 scaledDe字体巨细怎样调nsity 实践值见下:appstore

    /* 规范字体时,fontScale=1,非规范时,fontScale!=1 */
displayMetrics.scaledDensity = displayMetrics.density * configuration.fontScale

好了,到这儿思路底子完了,代码虽然简略,但这个思维涉及到的细节仍是值得揣摩的, gitHub 示例。

问题

运用这个方案后,通过检验,仍是有几点需求留神适配的:

  1. 页面宽高适配:当页面整体 UI 元素都扩展后,会存在其时页面寄存不下全部元素了的状况,这个时分就需求添加 Scroll 翻滚效果了;横向的话,可根据需求,闪现不可“..”。

  2. 部分元素不缩放:假定在其时页面,我想部分元素坚持原始巨细,不进行缩放呢?如上面所说的横向闪application现不可”..”状况,假定这个文本是很重要的,运appear用“github中文社区..”显然是不合适的。这时,我们能够获取元素原始巨细字体巨细怎样调,再动态设置:

    open fun dip2px(context: Context, dpValue: Float): Int {
val scale = context.applicationContext.resources.displayMetrics.density
return (dpValue * scale + 0.5f).toInt()
}

本文到这儿就完毕了。假定本文对你有用,来点个赞吧,我们的必定也是阿呆i坚持写作的动力。