1、原由android
爲了適應多屏幕分辨率,能夠在res目錄下創建不一樣的layout文件,例如想適應C8500(320*240)和Milestone(854*480),能夠在res目錄下創建layout-320*240和layout-854*480兩個目錄,而後在其中定義不一樣的佈局文件就能夠了;但在實際中並無湊效;這是爲何呢;api
在真機下調試才發現有問題,Android有個類DisplayMetrics能夠獲得分辨率等信息,方法以下:佈局
DisplayMetrics metrics;getWindowManager().getDefaultDisplay().getMetrics(metrics);spa
metrics.widthPixels 屏幕寬設計
metrics.heightPixels 屏幕高調試
metrics.density 屏幕密度orm
其它用不到的屬性就不寫了,調試中發現C8500獲得的是427*320,而而Milestone獲得是569*320;這是爲何呢?難道是Android API有問題?xml
2、探索ip
其實是本身對Android多屏幕分辨率理解不深入,那麼問題出在哪兒呢?這裏須要用到一個公式pixels = dps * (density / 160),在SDK中有提到,須要說明一點公式中的density與metrics.density不是一個東西,它們的關係是:metrics.density = density / 160,density的值有120、160、240、320(這在SDK中也有說明);好了直接套用公式就OK了C8500實際分辨率爲320*240,密度(也就是metrics.density的值)爲0.75,用公式算出來正好是427*320;Milestone實際分辨率是854*480,密度是1.5,算出來是569*320(有四捨五入的);開發
好吧,按照以上的結論直接在res目錄下創建layout-427*320和layout-569*320;分別編寫不一樣的佈局文件,OK!問題解決,終於能夠適應兩個手機屏幕了。
3、沒有結束……
真的就這麼搞定了嗎?彷佛沒有,把AndroidManifest.xml中android:minSdkVersion=」3″(一直都是3),中3改成4,問題又來了,界面又亂了,在兩個手機都亂了;怎麼回事呢?再調試,我那個暈,C8500手機屏幕分辨率又變了,變回320*240,套用上面的公式反而又錯了,程序又找不到佈局文件了,界面天然就亂了,這是WHY WHY WHY????
彆着急,再來看看問題出在哪兒。查找SDK,加上本身對Android多分辨率的支持的理解,真正的緣由應該是當android:minSdkVersion=」3″時也就是此時支持android1.5,在 Android 1.5以及更早的版本中,只支持3.2″ 屏幕上的HVGA (320×480)分辨率,開發人員也不須要考慮界面的適配性問題。從Android 1.6以後,平臺支持多種尺寸和分辨率的設備,這也就意味着開發人員在設計時要考慮到屏幕的多樣性。
因而可知,在android:minSdkVersion=」3″時,尚未多分辨率的概念,於是此時,DisplayMetrics獲得的寬和高是與密度相關的,也就是說此時獲得的寬和高都是以dp或dip爲單位的,要轉換成px纔是咱們一般聽說的分辨率。自android1.6及之後,DisplayMetrics獲得的寬和高都是以px爲單位的,不須要轉換。
總結一下:android的兼容性意味着應用程序api的降級。api的降級意味着在高端機(版本高配置高)上的顯示效果配不上
-------- 碰見的問題
獲取手機分辨率的代碼:
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); tv.setText("屏幕分辨率爲:"+dm.widthPixels+" * "+dm.heightPixels);
很簡單,可是有些高分辨率的手機獲取的不正常,好比使用Moto Milestone手機,這款手機是480x854分辨率的,但使用DisplayMetrics.widthPixels得的結果是320x533,而且若是按480x854切圖也顯示的太大,按320x533切圖顯示正常。緣由是你沒有在AndroidManifest.xml文件中設置參數android:minSdkVersion ,android在1.6以前是不支持WVGA個FWVGA的。
在AndroidManifest.xml加上下邊的代碼就ok了