-
屏幕适配不得不提到屏幕密度如何计算
屏幕密度计算.png
比如 1920px*1080px 5英寸:
√(1920^2 +1080^2)=2202.9071700823
2202.9071700823/5=440.5814340165(ppi)≈440ppi
-
存在问题
一般我们设计图都是以固定的尺寸来设计的。比如以分辨率1920px * 1080px来设计,以density为3来标注,也就是屏幕其实是640dp * 360dp。
而实际上以上面的例子来说440dpi/160 = 2.75(即1dp = 2.75px)而UI给的标注是(1dp = 3px),所以无法在不同设备上显示为同样效果的。 -
android中的dp在渲染前会将dp转为px,计算公式:
px = density * dp;
density = dpi / 160;
px = dp * (dpi / 160); -
如何适配
支持以宽或者高一个维度去适配,保持该维度上和设计图一致;
支持dp和sp单位,控制迁移成本到最小。
从dp和px的转换公式 :px = dp * density
可以看出,如果设计图宽为360dp,想要保证在所有设备计算得出的px值都正好是屏幕宽度的话,我们只能修改 density 的值。 -
方案(下面假设设计图宽度是360dp,以宽维度来适配)
由于字体也是用dp(不是用sp)进行设置的,所以字体也能进行适配
Activity的onCreate()进行调用
先来熟悉下 DisplayMetrics 中和适配相关的几个变量:
DisplayMetrics#density 就是上述的density
DisplayMetrics#densityDpi 就是上述的dpi
DisplayMetrics#scaledDensity 字体的缩放因子,正常情况下和density相等,但是调节系统字体大小后会改变这个值
public class ScreenAdaptationUtil {
public static void setCustomDensity(@NonNull Activity activity, @NonNull Application application) {
final DisplayMetrics displayMetrics = application.getResources().getDisplayMetrics();
final float targetDensity = displayMetrics.widthPixels / 360;
final int targetDensityDpi = (int) (160 * targetDensity);
displayMetrics.density = displayMetrics.scaledDensity = targetDensity;
displayMetrics.densityDpi = targetDensityDpi;
final DisplayMetrics activityDisplayDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayDisplayMetrics.density = activityDisplayDisplayMetrics.scaledDensity = targetDensity;
activityDisplayDisplayMetrics.densityDpi = targetDensityDpi;
}
}
网友评论