天天看點

手機、平闆多螢幕多分辨率适配

轉自:http://www.apkbus.com/android-83006-1-1.html

#本文參與——安卓巴士兩周年征文活動#

     最近因為android的發展廣泛,應用逐漸增多,更多的特性被人們多了解,運作平台也逐漸擴大。

從最開始的手機平台到如今的平闆電腦、液晶電視等等各種電子産品,光手機的分辨率就不知道到底有多少種

因為在中國你永遠不知道到底有多少山寨開發商開發了多少螢幕的手機以及平闆,液晶電視更是不用說,幾十幾百個

手機螢幕的大小。

         1、基本概念

     螢幕大小(screen size) – 螢幕的實際大小,用螢幕對角線長度來衡量(比如3.4寸,3.8寸)。android把螢幕分為以下4種:small,normal,large,extra large。

怎麼判斷?

     螢幕密度(Screen Density) - 一塊實際的螢幕區域有多少個像素,一般用dpi衡量(每英寸有多少個點)。相比起medium、high螢幕密度的裝置,在一塊确定大小的螢幕區域l密度為low的螢幕擁有的像素更少。android把螢幕密度分為4種:low,medium,high,extra high。

如何判斷是ldpi,mdpi,hdpi?

    方向(orientation) - 螢幕方向分為landscape(橫屏)和portrait(豎屏)。

    分辨率(Resolution) -  螢幕上的總實際像素數。對螢幕進行适配時,一般不關注它的分辨率,隻關注它的螢幕大小和密度。

     與密度無關的像素(Density-independent pixel,dp或dip) -  為了保證你的UI适合不同的螢幕密度,建議你采用dp來定義程式UI。

它的計算方法為:px = dp * (dpi / 160)

如何分辨一個螢幕是ldpi、mdpi、hdpi的方法呢?

手機、平闆多螢幕多分辨率适配

      2、怎樣适配多種螢幕

      a.在manifest裡定義你的程式支援的螢幕類型,相應代碼如下:

<supports-screens android:resizeable=["true"| "false"]

android:smallScreens=["true" | "false"]   //是否支援小屏

android:normalScreens=["true" | "false"]  //是否支援中屏

android:largeScreens=["true" | "false"]   //是否支援大屏

android:xlargeScreens=["true" | "false"]  //是否支援超大屏

android:anyDensity=["true" | "false"]    //是否支援多種不同密度的螢幕

android:requiresSmallestWidthDp=”integer”

android:compatibleWidthLimitDp=”integer”

android:largestWidthLimitDp=”integer”/>

      b.對不同大小的螢幕提供不同的layout。

      比如,如果需要對大小為large的螢幕提供支援,需要在res目錄下建立一個檔案夾layout-large/并提供layout。當然,也可以在res目錄下建立layout-port和layout-land兩個目錄,裡面分别放置豎屏和橫屏兩種布局檔案,以适應對橫屏豎屏自動切換。

手機、平闆多螢幕多分辨率适配

     c.對不同密度的螢幕提供不同的圖檔。

     應盡量使用點9格式的圖檔,如需對密度為low的螢幕提供合适的圖檔,需建立檔案夾drawable-ldpi/,并放入合适大小的圖檔。相應的,medium對應drawable-mdpi /,high對應drawable-hdpi/,extra high對應drawable-xhdpi/。

圖檔大小的确定:low:medium:high:extra high比例為3:4:6:8。舉例來說,對于中等密度(medium)的螢幕你的圖檔像素大小為48×48,那麼低密度(low)螢幕的圖檔大小應為36×36,高(high)的為72×72,extra high為96×96。

drawable-hdpi 該圖檔即适用于橫屏,也适用于豎屏drawable-land-hdpi,當螢幕為橫屏,且為高密度時,加載此檔案夾中的資源

drawable-port-hdpi,當螢幕為豎屏,且為高密度時,加載此檔案夾中的資源

手機、平闆多螢幕多分辨率适配

      d.在代碼中動态更改密度值。

      有時候會根據需要在代碼中動态地設定某個值,比如地圖位址提示框相對偏移量在不同密度的手機上是不同的。這時候可以通過以下方法求出螢幕密度:

DisplayMetrics metric = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metric);

int densityDpi = metric.densityDpi;  // 螢幕密度DPI(120 / 160 / 240)

然後可以在代碼中為這幾種密度分别設定偏移量

但是這種方法最好不要使用,最好的方式是在xml檔案中不同密度的手機進行分别設定。

這裡地圖的偏移量可以在values-hpdi,values-mdpi,values-ldpi三種檔案夾中的dimens.xml檔案進行設定。

        3、多螢幕适配的4條黃金原則

        a.在layout檔案中設定控件尺寸時應采用wrap_content,fill_parent和dp。

       具體來說,設定view的屬性android:layout_width和android:layout_height的值時,wrap_content,fill_parent或dp比pix更好。相應地,為了使文字大小更好的适應螢幕應該使用sp來定義文字大小。

       b.在程式的代碼中不要出現具體的像素值。

為了使代碼簡單,android内部使用pix為機關表示控件的尺寸,但這是基于目前螢幕基礎上的。為了适應多種螢幕,android建議開發者不要使用具體的像素來表示控件尺寸。

      c.不要使用AbsoluteLayout,這個已經很少用了,應使用RelativeLayout。

      d.對不同的螢幕提供合适大小的圖檔。

      4、怎樣測試你的程式是否支援多螢幕适配

      一般使用AVD Manager建立多個不同大小的模拟器,如下圖

手機、平闆多螢幕多分辨率适配

       參考文檔:http://developer.android.com/guide/practices/screens_support.html

上周原本答應出的文,因為周末不在深圳,是以拖稿了 -   -  對不起  王子  我有罪

大清早的來趕稿也不容易啊,以上是我看了API之後結合自己兩年來平闆開發的一點經驗,最後提醒一句,主流的分辨率一般是做五款,如果有人說要适配所有手機,請盡早提醒他,天不早了,别睡了,謝謝

原創文章 轉出請注明出處