屏幕适配

基本概念

屏幕尺寸

屏幕尺寸指屏幕的对角线的长度,单位是英寸,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

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

名称像素密度范围代表的分辨率屏幕密度换算比例
mdpi120dpi~160dpi320x480160
hdpi160dpi~240dpi480x8002401dp=1px4
xhdpi240dpi~320dpi720x12803201dp=2px8
xxhdpi320dpi~480dpi1080x19204801dp=3px12
xxxhdpi480dpi~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这个库比较适合接入到项目中。

参考