由于android 手机的屏幕宽高比样式太多了,在设计UI时,很多时候,会因为宽高比,分辨率不同会有展示上的差异。
android中的dp在渲染前会将dp转为px,计算公式:
-
px = density * dp;
-
density = dpi / 160;
-
px = dp * (dpi / 160);
我是这样解决的高度适配问题
在activity的onCreate方法前,调用:
fun screenFit(context: Context) {
val metrics: DisplayMetrics = context.resources.displayMetrics
val td = metrics.heightPixels / 760f
val dpi = (160 * td).toInt()
metrics.density = td
metrics.scaledDensity = td //此属性可以使得字体也会正常的展示
metrics.densityDpi = dpi
}
这样就适配了
2024.2.19日补充
之前用这个方法,是因为UI设计图的设计高度为760dp,因为在UI的垂直方向上控件很多,为了适配各种手机,于是取得是val targetDensity = metrics.heightPixels / 760f,取得td和dpi后,对metrics的各种属性即可进行赋值。
此外,如果需要适配Ui设计图的360dp的屏幕宽度,则可以
fun screenFit(context: Context) {
val metrics: DisplayMetrics = context.resources.displayMetrics
val td = metrics.widthPixels / 360f
val dpi = (160 * td).toInt()
metrics.density = td
metrics.scaledDensity = td //此属性可以使得字体也会正常的展示
metrics.densityDpi = dpi
}
最近面试时向面试官提到了此方法,我想我在项目中,面试官说此方法完全不可行,我在多个项目中用过,也不知是哪儿的问题,网上查了下也有类似的做法,甚至今日头条也用的此方案,代码少,入侵性很低。
有大佬知道问题出在哪儿麻烦补充。