Android 480DP屏幕使状态栏始终显示

糖果G-2的平板电脑产品使用的屏幕分辨率为800x480,在7inch的平板电脑上来讲,分辨率是相当低的。

Android 4.0的策略中,短边低于600dp的产品,status bar可以进行隐藏,比如打开图库等全屏应用的时候,status bar消失不见。这个时候如果想看到status bar,则要用手指快速从屏幕底部向上滑动。status bar出现后会覆盖原来app的内容。本来这是谷歌的策略,因为短边低于480dp,说明屏幕的尺寸在高度上很小,为了使屏幕能显示更多的内容,所以将状态栏隐藏。但是由于我们的产品模具问题,外壳是凸起的,不像大部分平板/手机是平的。很难将状态栏滑出来,所以有必要使状态栏始终显示。

代码在frameworks/base下

base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中


 879        int shortSizeDp = shortSize
 880                * DisplayMetrics.DENSITY_DEFAULT
 881                / DisplayMetrics.DENSITY_DEVICE;
 882        mStatusBarCanHide = shortSizeDp < 600; //短边小于600dp的时候,status bar可以隐藏


既然是根据分辨率来的,咱就把分辨率改大点不行么?

480 /128 * 160 = 600

所以将ro.sf.lcd_density=600

添加到system/build.prop

这样强制使屏幕尺寸变大,问题是得到解决了,但是感觉好奇怪,图标变得好小。怎么看都比较别扭。

于是要从代码着手。

2503                if (topIsFullscreen) {
2504                    if (mStatusBarCanHide) {
2505                        if (DEBUG_LAYOUT) Log.v(TAG, "Hiding status bar");

将if(mStatusBarCanHide) 替换为if(false)

状态栏是时钟显示了,但是仍然会遮挡全屏应用的底部,这样肯定是不行的。

索性,直接将mStatusBarCanHide赋值为false

以为这样肯定行了,哪知道问题更大,状态栏是始终有了,可是屏幕竟然变成了竖屏,就是在主界面下(非app下),屏幕始终竖屏显示,旋转也没有任何变化,但是在应用里面还是正常的。有点像手机的布局。

真奇怪,就改了一个mStatusBarCanHide的属性,而且这个变量只在PhoneWindowManager.java文件中用到,怎么会影响到布局呢?

在PhoneWindowManager.java中找mStatusBarCanHide用到的地方,唯一跟尺寸相关的地方就是

1244    public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation) {
1245        // Assumes the navigation bar appears on the bottom of the display in portrait.
1246          return fullHeight
1247            - (mStatusBarCanHide ? 0 : mStatusBarHeight)
1248              - ((fullWidth > fullHeight) ? 0 : mNavigationBarHeight);
1249    }

这个地方,该函数会在其他地方调用获取Display的高度

services/java/com/android/server/wm/WindowManagerService.java中

} else if (longSize >= 640 && shortSize >= 480) {
 6154                // VGA or larger screens at medium density are the point
 6155                // at which we consider it to be a large screen.
 6156                screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_LARGE;
 6157            } else {
 6158                screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_NORMAL;
 6159            }

其中的shortSize就是通过该函数获取的,由于mStatusBarCanHide = false, 得到的高度小于480,所以使用的布局为NORMA,不是原来的LARGE,才导致出现布局问题。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/fe94a7c4609f771ea0869e7231ebae11.html