手機、平板多屏幕多分辨率適配

轉自: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的方法呢?
計算DIP.jpg 

      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兩個目錄,裏面分別放置豎屏和橫屏兩種佈局文件,以適應對橫屏豎屏自動切換。
222.jpg 
     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,當屏幕爲豎屏,且爲高密度時,加載此文件夾中的資源
    
screens-densities.jpg 
      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創建多個不同大小的模擬器,如下圖

avds-config-300x166.jpg
       參考文檔http://developer.android.com/guide/practices/screens_support.html
上週原本答應出的文,因爲週末不在深圳,所以拖稿了 -   -  對不起  王子  我有罪
大清早的來趕稿也不容易啊,以上是我看了API之後結合自己兩年來平板開發的一點經驗,最後提醒一句,主流的分辨率一般是做五款,如果有人說要適配所有手機,請儘早提醒他,天不早了,別睡了,謝謝

原創文章 轉出請註明出處 
發佈了5 篇原創文章 · 獲贊 15 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章