糖果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,才导致出现布局问题。
这里直接将480替换为(480 - 36),36是mStatusBarHeight的值。
这样重新编译,刷机后就一切正常了。
所做修改详见如下diff
diff --git a/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 03edf1b..9029040 100755
--- a/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -880,6 +880,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
* DisplayMetrics.DENSITY_DEFAULT
/ DisplayMetrics.DENSITY_DEVICE;
mStatusBarCanHide = shortSizeDp < 600;
+ mStatusBarCanHide = false;
if (SystemProperties.get("ro.board.statusbar.hide", "false").equals("true")) {
@@ -894,6 +895,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if(mStatusBarCanHide){
mStatusBarHeight = 36;
}
+ mStatusBarHeight = 36;
mHasNavigationBar = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_showNavigationBar);
// Allow a system property to override this. Used by the emulator.
diff --git a/base/services/java/com/android/server/wm/WindowManagerService.java b/base/services/java/com/android/server/wm/WindowManagerService.java
index 88d4c66..62d7ebd 100644
--- a/base/services/java/com/android/server/wm/WindowManagerService.java
+++ b/base/services/java/com/android/server/wm/WindowManagerService.java
@@ -6150,7 +6150,7 @@ public class WindowManagerService extends IWindowManager.Stub
// 1.5xVGA or larger screens at medium density are the point
// at which we consider it to be an extra large screen.
screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_XLARGE;
- } else if (longSize >= 640 && shortSize >= 480) {
+ } else if (longSize >= 640 && shortSize >= (480 - 36)) {
// VGA or larger screens at medium density are the point
// at which we consider it to be a large screen.
screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_LARGE;
--
1.7.9.5