歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

Copyright © Linux教程網 All Rights Reserved