基本概念
屏幕尺寸
屏幕尺寸指屏幕的对角线的长度,单位是英寸,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; 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这个库比较适合接入到项目中。
参考