android 13 DisplayMetrics的xdpi是在系统初始化的代码流程
时间: 2024-03-28 08:42:43 浏览: 135
20个Android很有用的代码片段
在 Android 13(即 Android 3.2)中,DisplayMetrics的初始化流程与 Android 11(即 Android 4.0)类似,但具体实现方式有些细微差别。
1. WindowManagerService的构造函数中创建了DisplayManagerService对象:
```
mDisplayManager = new DisplayManagerService(context, wmHandler);
```
2. DisplayManagerService的构造函数中先初始化了DisplayAdapter集合,然后通过DisplayManagerGlobal.getInstance()方法获取DisplayManagerGlobal对象:
```
mDisplayAdapters = new ArrayList<DisplayAdapter>();
mDisplayAdapters.add(new LocalDisplayAdapter(this));
mGlobal = DisplayManagerGlobal.getInstance();
```
3. DisplayManagerGlobal的构造函数中创建了DisplayManager对象,并调用DisplayManager对象的init()方法初始化DisplayMetrics:
```
mDm = new DisplayManagerService(context.getApplicationContext(), wmHandler);
mDm.init();
```
4. DisplayManagerService的init()方法中先初始化了DisplayPowerController对象,然后遍历DisplayAdapter集合调用其init()方法,最后计算出DisplayMetrics:
```
mPowerController = new DisplayPowerController(context, this, mHandler, mBlanker, mDisplayReadyListener);
for (DisplayAdapter adapter : mDisplayAdapters) {
adapter.registerLocked();
adapter.initializeLocked();
}
mDisplayInfos = mTempDisplayInfos.toArray(new DisplayDeviceInfo[mTempDisplayInfos.size()]);
calculateInitialDisplayMetricsLocked();
```
其中,calculateInitialDisplayMetricsLocked()方法的实现如下:
```
private void calculateInitialDisplayMetricsLocked() {
final int width = mDisplayInfos[0].mode.hResolution;
final int height = mDisplayInfos[0].mode.vResolution;
final float refreshRate = mDisplayInfos[0].mode.refreshRate;
final float xdpi = width * 25.4f / mDisplayInfos[0].mode.physicalWidth;
final float ydpi = height * 25.4f / mDisplayInfos[0].mode.physicalHeight;
final float density = (xdpi + ydpi) / 2;
final int densityDpi = (int) (density * 160 + 0.5f);
mInitialDisplayWidth = width;
mInitialDisplayHeight = height;
DisplayMetrics metrics = new DisplayMetrics();
metrics.density = density;
metrics.densityDpi = densityDpi;
metrics.widthPixels = width;
metrics.heightPixels = height;
metrics.xdpi = xdpi;
metrics.ydpi = ydpi;
mInitialDisplayDensity = densityDpi;
mCompatibleScreenWidthDp = (int) (width / (densityDpi / 160.0f));
mCompatibleScreenHeightDp = (int) (height / (densityDpi / 160.0f));
mDisplayMetrics.setTo(metrics);
}
```
可以看到,与 Android 11 中的实现非常类似,只是计算方法略有不同。在 Android 13 中,DisplayMetrics的xdpi是通过计算屏幕物理宽度和分辨率得出的。
阅读全文