屏幕适配

Catalogue   

基本概念

屏幕尺寸

屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米

屏幕分辨率

屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点

屏幕像素密度

屏幕像素密度是指每英寸上的像素点数

dp、dip、dpi、sp、px

  • dpi:屏幕像素密度
  • dp/dip:Density Independent Pixels的缩写,即密度无关像素
  • px:物理像素
  • sp:scale-independent pixels,文字大小使用像素

公式转换

  • px = density * dp;
  • density = dpi / 160;
  • px = dp * (dpi / 160);

屏幕尺寸、分辨率、像素密度三者关系

DisplayMetrics中和适配相关的几个变量:

  • DisplayMetrics#density:就是上述的density
  • DisplayMetrics#densityDpi: 就是上述的dpi
  • DisplayMetrics#scaledDensity: 字体的缩放因子,正常情况下和density相等,但是调节系统字体大小后会改变这个值

mdpi、hdpi、xdpi、xxdpi

根据不同像素范围来存储的资源文件夹

名称 像素密度范围 代表的分辨率 屏幕密度 换算 比例
mdpi 120dpi~160dpi 320x480 160
hdpi 160dpi~240dpi 480x800 240 1dp=1px 4
xhdpi 240dpi~320dpi 720x1280 320 1dp=2px 8
xxhdpi 320dpi~480dpi 1080x1920 480 1dp=3px 12
xxxhdpi 480dpi~640dpi

适配原理

今日头条适配方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if (sNoncompatDensity == 0) {
sNoncompatDensity = appDisplayMetrics.density;
sNoncompatDensity = appDisplayMetrics.scaledDensity;
application.registerComponentCallbacks(new ComponentCallbacks() {

public void onConfigurationChanged(Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 0) {
//系统字体大小发生变化监听
sNoncompatScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
}
}


public void onLowMemory() {

}
});
}
float targetDensity = appDisplayMetrics.widthPixels / 360;//360指设计图原始dp值
float targetScaleDensity = targetDensity * (sNoncompatScaledDensity / sNoncompatDensity);
int targetDensityDpi = (int) (160 * targetDensity);
appDisplayMetrics.density = targetDensity;
appDisplayMetrics.scaledDensity = targetScaleDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;

final DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
activityDisplayMetrics.density = targetDensity;
activityDisplayMetrics.scaledDensity = targetScaleDensity;
activityDisplayMetrics.densityDpi = targetDensityDpi;

根据设备的实际宽度与设计图的dp值,算出设备的密度和屏幕像素密度。

smallestWidth

根据屏幕的最小宽度去寻找对应的配置文件,设置高宽值。可参考:SmallestWidth 限定符适配方案

总结

综合各方面考虑,目前觉得AndroidAutoSize这个库比较适合接入到项目中。

参考