android支持多屏幕機制

 

術語
   1.Screen size 屏幕實際尺寸。
Android講屏幕實際尺寸分爲3個通用的尺寸。
  
   2.Aspect ratio 長寬比

   3.Resolution 分辨率

   4.Density 密度

   5.Density-independent pixel 密度無關的像素

介紹:Adnroid1.6或以上SDK,在AndroidManifest.xml中提供新的一個元素<supports-screens>用於支持多屏幕機制。
<supports-screens
         android:largeScreens="true"   是否支持大屏
          android:normalScreens="true"  是否支持中屏
          android:smallScreens="true"   是否支持小屏
          android:anyDensity="true"     是否支持多種不同密度
/>


Android提供3種方式處理屏幕自適應
一.預縮放的資源 ( 基於尺寸和密度去尋找圖片,其實就是找res文件夾下的資源 )
1.如果找到相應的尺寸和密度,則利用這些圖片進行無縮放顯示。

 

2.如果找到相應的尺寸,但是找不到密度,則嘗試找該尺寸下其他密度資源進行縮放(從高到低)。

 

3.如果沒法找到相應的尺寸,則忽略所有包含尺寸目錄,直接找只包含密度目錄。

   如果找到匹配密度,資源縮放則利用這些圖片進行無縮放顯示。

 

4.如果都無法匹配,則使用默認圖片進行縮放顯示。默認圖片默認標配 "medium" (160)。

 

5.如果"medium" (160)沒有資源,則再到其他密度資源包中找,並縮放顯示(從高到低)。

二.自動縮放的像素尺寸和座標(密度兼容)
1.如果應用程序不支持不同密度android:anyDensity="false",系統自動縮放圖片尺寸和這個圖片的座標。

 

2.對於預縮放的資源,當android:anyDensity="false",系統還是會嘗試去匹配尺寸和密度。

         1.如果找到相應的尺寸和密度,則利用這些圖片進行無縮放顯示。

 

         2.如果找到相應的尺寸,但是找不到密度,則嘗試找該尺寸下其他密度資源進行縮放(從高到低)。


         3.如果沒法找到相應的尺寸,則忽略所有包含尺寸目錄,直接找只包含密度目錄。

            如果找到匹配密度,資源縮放則利用這些圖片進行無縮放顯示。

 

         4.如果都無法匹配,則使用默認圖片進行縮放顯示。默認圖片默認標配 "medium" (160)。

 

         5.如果"medium" (160)沒有資源,則再到其他密度資源包中找,並縮放顯示(從高到低)。

 

3.android:anyDensity="false",只對密度兼容起作用,尺寸兼容沒效果

 

自己加上

 

4.關於取圖片寬度和高度問題。

      1.符合屏幕dpi的圖片,通過Bitmap類取高度和寬度數值時,數值跟圖片原本大小一樣。

      2.符合屏幕dpi的圖片,通過Drawable類取Intrinisc高度和寬度數值時,數值大小會根據BitmapScale / TargetDensityScale比值變化。

     3.不符合屏幕dpi的圖片,通過Bitmap類取高度和寬度數值時,數值是系統縮放後的數字。

     4.不符合屏幕dpi的圖片,通過Drawable類取Intrinisc高度和寬度數值時,數值大小會根據BitmapScale / TargetDensityScale比值變化。

 

     註明:BitScale = 圖評dpi實際密度,TargetDensityScale = 屏幕實際密度。

 

三.兼容模式顯示在大屏幕,尺寸(尺寸兼容)
1.對於你在<supports-screens>聲明不支持的大屏幕,而這個屏幕尺寸是larger的話,系統同樣使用尺寸爲                   ("normal")和密度爲("medium)顯示,不過會出現一層黑色的背景。不是居中顯示。


密度獨立:
系統默認應用支持DIP單位的,三個使用DIP的地方:
1.加載資源時,使用DIP實現預縮放的資源。
2.在Layout使用DIP,系統自動完成縮放。
3.在應用程序中,自動縮放一些絕對像素。
   (只有在android:anyDensity="false"生效)即屏幕自適應方式二
4.像素單位都使用DIP,文本單位使用SP

最佳屏幕獨立實踐:
1.使用wrap_content, fill_parent 和使用dip作爲像素單位in XML layout files。
2.避免使用AbsoluteLayout
3.在代碼中,不要使用像素數字硬編碼,而是要通過dip轉換爲px。
    例子:
  你使用手勢分析器分析一個scroll手勢,假如,你滾動的距離是16px。

   an inch = 2.54 cm
1.在一個160dip的屏幕中,你實際移動距離 16px / 160dpi = 1/10th of an inch (or 2.5 mm)
2.在一個240dip的屏幕中,你實際移動距離 16px / 240dpi = 1/15th of an inch (or 1.7 mm)
 // The gesture threshold expressed in dip
 private static final float GESTURE_THRESHOLD_DIP = 16.0f;
  // Convert the dips to pixels
  final float scale = getContext().getResources().getDisplayMetrics().density;
  mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale);
4.使用密度和/或尺寸特定資源(通過文件夾)


關於預縮放或者自動縮放圖片或9格圖
1.系統是一定對會資源包下的圖片進行合理的縮放。
   例如:一張240x240高密度圖片,顯示在中密度的屏幕上,圖片大小自動變爲160x160。
2.如果你不想系統自動幫你縮放圖片,可以建立一個res/drawable-nodpi文件夾,存放你的圖片。
3.也可以通過BitmapFactory.Options 設置完成你想要的圖片縮放等效果或9格圖(在畫圖時)。
4.自動縮放圖片比預縮放花費更多CPU。 


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