/frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java
简化计算公式:x = (最短边px / 2)/ 默认dpi
小: 默认显示
默认: 默认显示
大: x > 1.09
较大:x > 1.18
最大:x> 1.27
默认dpi获取方式:
adb shell wm density
adb shell getprop ro.sf.lcd_density
// 获取默认dpi
final int defaultDensity = DisplayDensityUtils.getDefaultDisplayDensity(
Display.DEFAULT_DISPLAY);
// 选取最短边像素
final int minDimensionPx = Math.min(metrics.widthPixels, metrics.heightPixels);
// 160 * 最小边像素 / 320
final int maxDensity = DisplayMetrics.DENSITY_MEDIUM * minDimensionPx / MIN_DIMENSION_DP;
// 最大dpi / 默认dpi 最大值为1.5
final float maxScale = Math.min(MAX_SCALE, maxDensity / (float) defaultDensity);
// 最小倍数 默认值 0.85
final float minScale = MIN_SCALE;
// 计算档位数量,当(maxScale-1) / 0.09大于3时取3,其它时候取(maxScale-1) / 0.09,通常最大档位在平板中出现。
final int numLarger = (int) MathUtils.constrain((maxScale - 1) / MIN_SCALE_INTERVAL,
0, SUMMARIES_LARGER.length);
// 小是默认,可忽略
final int numSmaller = (int) MathUtils.constrain((1 - minScale) / MIN_SCALE_INTERVAL,
0, SUMMARIES_SMALLER.length);
MathUtils.constrain
public static float constrain(float amount, float low, float high) {
return amount < low ? low : (amount > high ? high : amount);
}
计算每档dpi的值
小:默认乘以0.85
if (numLarger > 0) {
final float interval = (maxScale - 1) / numLarger;
for (int i = 0; i < numLarger; i++) {
// Round down to a multiple of 2 by truncating the low bit.
// (最大dpi-默认dpi) * 当前档位 / 总档位数 + 默认dpi
final int density = ((int) (defaultDensity * (1 + (i + 1) * interval))) & ~1;
if (currentDensity == density) {
currentDensityIndex = curIndex;
}
values[curIndex] = density;
entries[curIndex] = res.getString(SUMMARIES_LARGER[i]);
curIndex++;
}
}