当前位置: 代码迷 >> Android >> Android 480DP荧屏使状态栏始终显示
  详细解决方案

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

热度:31   发布时间:2016-05-01 11:25:20.0
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,才导致出现布局问题。

这里直接将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


  相关解决方案