糖果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,才導致出現布局問題。