渲染UI前会将dp转成px,相关计算公式:
dip = (宽的平方+高的平方)(px)开根号/屏幕尺寸
density = dip/160
px = density*dp
图片文件:
mdip-像素密度:120~160(dp) 图片大小:48*48(px)
hdip-像素密度:160~240(dp) 图片大小:72*72(px)
xhdip-像素密度:240~320(dp) 图片大小:96*96(px)
xxhdip-像素密度:320*480(dp) 图片大小:144*144(px)
xxxhdip-像素密度:480*640(dp) 图片大小:192*192(px)
比例:2:3:4:6:8
适配方式一(参考资料:https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA):
说明:初始化density和字体的缩放因子
监听application的系统设置变化,重新修改字体缩放因子
重新设置设备的density、dpi和scaleDensity
测试发现设置application下的displayMetrics的属性和app下的displayMetrics的属性是一样的效果
代码如下:
private static float mNonCompatDisplay;
private static float mNonCompatScaledDisplay;
public static void setDisplayMetrics(Activity activity, final Application application, int displayScale) {
final DisplayMetrics appDisplayMetrics = application.getResources().getDisplayMetrics();
if (mNonCompatDisplay == 0) {
mNonCompatDisplay = appDisplayMetrics.density;
mNonCompatScaledDisplay = appDisplayMetrics.scaledDensity;
application.registerComponentCallbacks(new ComponentCallbacks() {
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig != null && newConfig.fontScale > 0) {
mNonCompatScaledDisplay = application.getResources().getDisplayMetrics().scaledDensity;
}
}
@Override
public void onLowMemory() {
}
});
}
float targetDensity = appDisplayMetrics.widthPixels / displayScale;
float targetScaledDensity = targetDensity * (mNonCompatScaledDisplay / mNonCompatDisplay);
int targetDensityDpi = (int) (160 * targetDensity);
appDisplayMetrics.density = targetDensity;
appDisplayMetrics.scaledDensity = targetScaledDensity;
appDisplayMetrics.densityDpi = targetDensityDpi;
// DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
// activityDisplayMetrics.density = targetDensity;
// activityDisplayMetrics.scaledDensity = targetScaledDensity;
// activityDisplayMetrics.densityDpi = targetDensityDpi;
}