前言
2017年9月,拜腾的横空出世,打破了车载主机界一直以来的沉寂,各大媒体也是不吝词藻的对它的超长中控屏进行了大肆的报道。这个时候作为同为车机供应者的诸位友商心里却不那么的平静,恨不得在发布会现场带上一把尺子。要知道,咱们国人的借鉴能力,那在世界上都是有一号的,很快的各大厂商也纷纷开始推广起了自己的超长屏。
谁的锅?
所谓超长屏,即在中控主机上既能显示汽车仪表,同时又可以显示地图导航的一块屏幕,对于应用的显示是可以做全屏展示和半屏展示切换的,即App从3840720分辨率到1280720分辨率的切换。做这块长屏适配的时候,我们本以为只要做好长屏切换短屏的时候UI界面的适配就可以高枕无忧,没想到在实机调试的时候,我们却被一个很尴尬的问题困了许久,首先让我们来看一下在3840*720屏幕上我们的显示效果。
超长屏显示截图.png
从图片中可以看到,我们的应用并没有能够充满屏幕而只是占据了左边很窄的一个部分,这的确是一个非常离奇的现象,因为我们的布局使用的是填充结构,也就是match_parent,按逻辑来说应该会是拉伸至屏幕整个宽度。
layout布局文件.png
因为用手机和夜神模拟器模拟器(3840*720分辨率)我们的应用都是有进行调试过的,于是乎,我们开始怀疑是主机厂的FrameWork定制层出了问题,因为前文提到过主机厂是可以动态控制我们应用3840与1280的显示空间的。
论证自己的假设
为了证明自己的“清白”,我们特意在新的版本中增加了对rootView的Log打印信息,方法如下:
private void printRootViewWidthAndHeight(){
fmParent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
fmParent.getViewTreeObserver().removeOnPreDrawListener(this);
int width = fmParent.getWidth();
int height = fmParent.getHeight();
Logger.t(TAG).d("ParentView_width_is: "+width+" height_i