android 4.1 強制使用720dp的佈局

           機器升級爲android 4.1,10寸的平板跟以前的佈局沒有什麼兩樣,但是7寸的就出了點問題。

           谷歌Nexus 7也是7寸,默認使用的layout跟手機有些相似,但不全是手機佈局。Nexus 7是1280 x 800,DPI 爲213,這樣經過計算,寬度換算爲DP就是

800 * 160 / 213 = 600; 4.1中對於600 ~ 719 dp的分辨率使用一種新的佈局,姑且叫做Phone Tablet吧。我們的平板是1024 x 600分辨率。DPI 和DP 都是600,但是

這樣設置之後,看不到導航鍵。

           看了網上關於谷歌Nexus 7使用平板佈局的方法,就是去修改ro.sf.lcd_density這個屬性,知道修改後變爲720DP 以上,這樣的話,我們的7寸平板要修改爲小於 133,因爲只有這樣600 * 160 / 133 = 721;纔會使用720DP的佈局。但是這樣修改之後,感覺界面怪怪的,圖標和字體都很小。因爲這樣修改後,實際上在邏輯上,屏幕尺寸是變大了(變爲 7 *160/133) 。

           4.1的代碼中確實對於600DP~ 719DP之間做了特殊的修改,這部分改動太大,想直接revert不太現實,有太多的衝突。所以需要找到一個全局的,能強制使用720DP佈局的地方,關鍵就在如何找到使用哪一種佈局資源作爲當前系統的佈局。

          

              查了點資料,找到Android系統中選擇使用哪一種佈局的文件

在frameworks/base目錄下的libs/androidfw/ResourceTypes.cpp 

bool ResTable_config::match(const ResTable_config& settings) 

在該函數中,是選擇佈局的關鍵。這個函數把不合是的佈局過濾掉,剩下的佈局中,最大的那個就認爲是最合適的。

比如 480DP, 600DP, 720DP,把720DP過濾掉了,剩下的就選600DP作爲當前最好的佈局。    

           只需修改如下幾行

 
+       int WidthDp = settings.smallestScreenWidthDp;
+       if (WidthDp < 720 && 599 < WidthDp) WidthDp = 720;
         if (smallestScreenWidthDp != 0
-                && smallestScreenWidthDp > settings.smallestScreenWidthDp) {
+                && smallestScreenWidthDp > WidthDp) {
             return false;
         }

即可強制使用720DP 的佈局。

其中smallestScreenWidthDp是在循環中賦值的,有幾個layout 資源文件,就有幾次循環

settings.smallScreenWidthDp是當前系統的屏幕寬度方向的像素無關分辨率,這裏是600. 原來 的程序是 720 > 600.所以被過濾掉,而600 > 600爲假,所以被保留下來。

           這樣改過之後,還需要修改另外一個地方,否則還是沒有Navigation Bar.

同樣是frameworks/base目錄下

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

--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -1183,7 +1183,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
             // 0-599dp: "phone" UI with a separate status & navigation bar
             mHasSystemNavBar = false;
             mNavigationBarCanMove = true;
-        } else if (shortSizeDp < 720) {
+        } else if (false && shortSizeDp < 720) {
             // 600-719dp: "phone" UI with modifications for larger screens
             mHasSystemNavBar = false;
             mNavigationBarCanMove = false;

這樣就把整個系統中對600 ~719DP的處理給繞過去了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章