首先先转发一篇文章,讲解Android 多屏显示流程的,不熟悉的流程的可以看一下这篇文章
Android显示设备管理以及转屏流程
不过这里需要讲的不是流程,而是记录在副屏开发时,遇到的一些技术问题。
在开发副屏应用的时候,遇到一个问题,开发的app在主屏上显示是正常的,但是在副屏上显示,图片和字体有非常明显的拉伸,但是设置的宽高都是wrap_content,这个现象就非常奇怪。
发现主副屏唯一的区别就是density值不同,相同的屏幕但是表现却不一致,屏幕互换现象也存在,那么就需要设置副屏的density跟主屏一致,发现问题解决了。
1.Android 支持多屏显示,在修改主屏的density值时,可以在init.rc中通过修改ro.sf.lcd_density 的值来实现
# Set the density to 160 tvdpi to match CDD.
setprop ro.sf.lcd_density 160
2.副屏的density值没有引用主屏的值,而是通过计算出来的(可以通过dumpsys display来看)。
以Android 8.1为例,在DisplayDeviceInfo.java(/frameworks/base/services/core/java/com/android/server/display/目录下)
public void setAssumedDensityForExternalDisplay(int width, int height) {
densityDpi = Math.min(width, height) * DisplayMetrics.DENSITY_XHIGH / 1080;
// Technically, these values should be smaller than the apparent density
// but we don't know the physical size of the display.
xDpi = densityDpi;
yDpi = densityDpi;
}
这个方法中会通过副屏的宽高值来计算出副屏的density,以1920*720的屏幕来计算, density=720*320/1080 =213.
其中DisplayMetrics.DENSITY_XHIGH是定值320,density是int类型,最后取整就是213,这就是副屏的density。
在这里修改副屏density的值,改成需要的值即可。副屏执行到这里可以看转发的那边流程文档,上面介绍的很详细,这里不再赘述。