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