Android屏幕适配

  • 屏幕适配不得不提到屏幕密度如何计算


    Android屏幕适配_第1张图片
    屏幕密度计算.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;
    }
}
  • 参考
    https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA

你可能感兴趣的:(Android屏幕适配)