美文网首页
Android屏幕适配

Android屏幕适配

作者: Wang_Mr | 来源:发表于2018-06-13 10:47 被阅读0次
    • 屏幕适配不得不提到屏幕密度如何计算


      屏幕密度计算.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;
        }
    }
    

    相关文章

      网友评论

          本文标题:Android屏幕适配

          本文链接:https://www.haomeiwen.com/subject/qcadeftx.html