Android 屏幕自適應問題

Android9 patch 圖片 (.9.png 格式圖片) 的特色和製做
一.9.png格式的文件的特色
   與傳統的png 格式圖片相比, 9.png 格式圖片在圖片四周有一圈一個像素點組成的邊沿,該邊沿用於對圖片的可擴展區和內容
顯示區進行定義。這種格式的圖片在android 環境下具備自適應調節大小的能力。(1)容許開發人員定義可擴展區域,當須要延伸圖
片以填充比圖片自己更大區域時,可擴展區的內容被延展。(2)容許開發人員定義內容顯示區,用於顯示文字或其餘內容. 以下圖所示:
左側和上方的黑線交叉的部分便可擴展區域,右側和下方的黑線交叉的部分即內容顯示區.
                              
二 .9.png 圖片的製做
  android sdk 的 tools文件夾下提供了製做該格式圖片的工具 draw9patch.bat。使用此工具打開任意圖片以後,將鼠標置於圖片上。
  被黑色覆蓋的是不可編輯(鎖住)的區域,周圍的一圈一個像素的邊沿是可編輯區域。按住鼠標左鍵,在左側和上方的邊沿畫出可擴展區。

 在右側和下方畫出內容顯示區。完成繪製之後,選擇file-> save ,便可保存爲 .9.png 格式的文件,並在android項目中使用。 html


代碼動態佈局: java

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. //獲取屏幕高寬  
  2. DisplayMetrics metric = new DisplayMetrics();  
  3. getWindowManager().getDefaultDisplay().getMetrics(metric);  
  4. windowsHeight = metric.heightPixels;  
  5. windowsWight = metric.widthPixels;  
  6.    
  7. //動態改變佈局  
  8. LinearLayout production_factory = (LinearLayout)findViewById(R.id.production_factory);  
  9. LayoutParams params = production_factory.getLayoutParams();  
  10. params.height = windowsHeight / 2;  
  11. production_factory.setLayoutParams(params);  
一、屏幕相關概念  
1.1分辨率 
是指屏幕上有橫豎各有多少個像素 
1.2屏幕尺寸 
指的是手機實際的物理尺寸,好比經常使用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 
android將屏幕大小分爲四個級別(small,normal,large,and extra large)。 
1.3屏幕密度 
每英寸像素數 
手機能夠有相同的分辨率,但屏幕尺寸能夠不相同, 
Diagonal pixel表示對角線的像素值(=),DPI=933/3.7=252 
android將實際的屏幕密度分爲四個通用尺寸(low,medium,high,and extra high) 
通常狀況下的普通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi 
對於屏幕來講,dpi越大,屏幕的精細度越高,屏幕看起來就越清楚 
1.4密度無關的像素(Density-independent pixel——dip) 
dip是一種虛擬的像素單位 
dip和具體像素值的對應公式是dip/pixel=dpi值/160,也就是px = dp * (dpi / 160) 
當你定義應用的佈局的UI時應該使用dp單位,確保UI在不一樣的屏幕上正確顯示。 

手機屏幕分類和像素密度的對應關係如表1所示 
手機尺寸分佈狀況(http://developer.android.com/resources/dashboard/screens.html)如圖所示, 
目前主要是以分辨率爲800*480和854*480的手機用戶居多 
從以上的屏幕尺寸分佈狀況上看,其實手機只要考慮3-4.5寸之間密度爲1和1.5的手機 
二、android多屏幕支持機制  
Android的支持多屏幕機制即用爲當前設備屏幕提供一種合適的方式來共同管理並解析應用資源。 
Android平臺中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合適資源。 
指定大小(size-specific)的合適資源是指small, normal, large, and xlarge。 
指定密度(density-specific)的合適資源,是指ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high). 
Android有個自動匹配機制去選擇對應的佈局和圖片資源 
1)界面佈局方面 
   根據物理尺寸的大小準備5套佈局: 
    layout(放一些通用佈局xml文件,好比界面頂部和底部的佈局,不會隨着屏幕大小變化,相似windos窗口的title bar), 
    layout-small(屏幕尺寸小於3英寸左右的佈局),  
    layout-normal(屏幕尺寸小於4.5英寸左右), 
    layout-large(4英寸-7英寸之間), 
    layout-xlarge(7-10英寸之間)

小米3是5英寸,屬於layout-large android

2)圖片資源方面 
  須要根據dpi值準備5套圖片資源: 
    drawable:主要放置xml配置文件或者對分辨率要求較低的圖片 
    drawalbe-ldpi:低分辨率的圖片,如QVGA (240x320) 
    drawable-mdpi:中等分辨率的圖片,如HVGA (320x480) 
    drawable-hdpi:高分辨率的圖片,如WVGA (480x800),FWVGA (480x854) 
    drawable-xhdpi:至少960dp x 720dp 
windows

小米3:主屏分辨率 1920x1080像素 屏幕像素密度 441ppi
工具

Android有個自動匹配機制去選擇對應的佈局和圖片資源。 
  系統會根據機器的分辨率來分別到這幾個文件夾裏面去找對應的圖片。 
  在開發程序時爲了兼容不一樣平臺不一樣屏幕,建議各自文件夾根據需求均存放不一樣版本圖片。 

三、AndroidManifest.xml 配置 
android從1.6和更高,Google爲了方便開發者對於各類分辨率機型的移植而增長了自動適配的功能 
          <supports-screens 
           android:largeScreens="true"  
            android:normalScreens="true" 
            android:smallScreens="true"  
            android:anyDensity="true"/> 
3.1是否支持多種不一樣密度的屏幕 
android:anyDensity=["true" | "false"] 
若是android:anyDensity="true" 
指應用程序支持不一樣密度,會根據屏幕的分辨率自動去匹配。 
若是android:anyDensity="false" 
應用程序支持不一樣密度,系統自動縮放圖片尺寸和這個圖片的座標。 佈局

具體解釋一下系統是如何自動縮放資源的。 
例如咱們在hdpi,mdpi,ldpi文件夾下擁有同一種資源,那麼應用也不會自動地去相應文件夾下尋找資源,這種狀況都是出如今高密度,以及低密度的手機上,好比說一部240×320像素的手機, 若是設置android:anyDensity="false",Android系統會將240 x 320(低密度)轉換爲 320×480(中密度),這樣的話,應用就會在小密度手機上加載mdpi文件中的資源。 

3.2是否支持大屏幕 
android:largeScreens=["true" | "false"] 
若是在聲明不支持的大屏幕,而這個屏幕尺寸是larger的話,系統使用尺寸爲("normal")和密度爲("medium)顯示, 
不過會出現一層黑色的背景。 
3.3是否支持小屏幕 
android:smallScreens=["true" | "false"] 
若是在聲明不支持的小屏幕,而當前屏幕尺寸是smaller的話,系統也使用尺寸爲("normal")和密度爲("medium)顯示 
若是應用程序能在小屏幕上正確縮放(最低是small尺寸或最小寬度320dp),那就不須要用到本屬性。不然,就應該爲最小屏幕寬度標識符設置本屬性 
來匹配應用程序所需的最小尺寸。  spa

四、Android提供3種方式處理屏幕自適應 
4.1預縮放的資源(基於尺寸和密度去尋找圖片) 
1)若是找到相應的尺寸和密度,則利用這些圖片進行無縮放顯示。 
2)若是無法找到相應的尺寸,而找到密度,則認爲該圖片尺寸爲 "medium",利用縮放顯示這個圖片。 
3)若是都沒法匹配,則使用默認圖片進行縮放顯示。默認圖片默認標配 "medium" (160)。 
4.2自動縮放的像素尺寸和座標(密度兼容) 
1)若是應用程序不支持不一樣密度android:anyDensity="false",系統自動縮放圖片尺寸和這個圖片的座標。 
2)對於預縮放的資源,當android:anyDensity="false",也不生效。 
3)android:anyDensity="false",只對密度兼容起做用,尺寸兼容沒效果 
4.3兼容更大的屏幕和尺寸(尺寸兼容) 
1)對於你在聲明不支持的大屏幕,而這個屏幕尺寸是normal的話,系統使用尺寸爲    ("normal")和密度爲("medium)顯示。 
2.)對於你在聲明不支持的大屏幕,而這個屏幕尺寸是larger的話,系統一樣使用尺寸爲("normal")和密度爲("medium)顯示, 
不過會出現一層黑色的背景。 

五、Android系統自動適配技巧 
Android系統採用下面兩種方法來實現應用的自動適配: 
1)佈局文件中定義長度的時候,最好使用wrap_content,fill_parent, 或者dp 進行描述,這樣能夠保證在屏幕上面展現的時候有合適的大小 
2)爲不一樣屏幕密度的手機,提供不一樣的位圖資源,可使得界面清晰無縮放。 
對應bitmap 資源來講,自動的縮放有時會形成放大縮小後的圖像變得模糊不清,這是就須要應用爲不一樣屏幕密度配置提供不一樣的資源:爲高密度的屏幕提供高清晰度的圖像等。 
3)不要使用AbsoluteLayout 
4)像素單位都使用DIP,文本單位使用SP 


六、在代碼中獲取屏幕像素、屏幕密度 
DisplayMetrics metric = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metric); 
int width = metric.widthPixels;  // 屏幕寬度(像素) 
int height = metric.heightPixels;  // 屏幕高度(像素) 
float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5) 
int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240) 


七、 通常多分辨率處理方法及其缺點 
7.1 圖片縮放 
基於當前屏幕的精度,平臺自動加載任何未經縮放的限定尺寸和精度的圖片。若是圖片不匹配,平臺會加載默認資源而且在放大或者縮小以後能夠知足當前界面的顯示要求。例如,當前爲高精度屏幕,平臺會加載高精度資源(如HelloAndroid中drawable-hdpi 中的位圖資源),若是沒有,平臺會將中精度資源縮放至高精度,致使圖片顯示不清晰。 
7.2 自動定義像素尺寸和位置 
若是程序不支持多種精度屏幕,平臺會自動定義像素絕對位置和尺寸值等,這樣就能保證元素能和精度160 的屏幕上同樣能顯示出一樣尺寸的效果。例如,要讓WVGA 高精度屏幕和傳統的HVGA 屏幕同樣顯示一樣尺寸的圖片,當程序不支持時,系統會對程序慌稱屏幕分辨率爲320×480,在(10,10)到(100,100)的區域內繪製圖形完成以後,系統會將圖形放大到(15,15)到(150,150)的屏幕顯示區域。 
7.3 兼容更大尺寸的屏幕 
當前屏幕超過程序所支持屏幕的上限時,定義supportsscreens元素,這樣超出顯示的基準線時,平臺在此顯示黑色的背景圖。例如,WVGA 中精度屏幕上,如程序不支持這樣的大屏幕,系統會謊稱是一個320×480 的,多餘的顯示區域會被填充成黑色。 
7.4 採用OpenGL 動態繪製圖片 
Android 底層提供了OpenGL 的接口和方法,能夠動態繪製圖片,可是這種方式對不熟悉計算機圖形學的開發者來說是一個很大的挑戰。通常開發遊戲,採用OpenGL 方式。 
7.5 多個apk 文件 
Symbian 和傳統的J2ME 就是採用這種方式,爲一款應用提供多個分辨率版本,用戶根據本身的需求下載安裝相應的可執行文件。針對每一種屏幕單獨開發應用程序不失爲一種好方法,可是目前Google Market 對一個應用程序多個分辨率版本的支持還不完善,開發者仍是須要儘量使用一個apk 文件適應多個分辨率。 Android9 patch 圖片 (.9.png 格式圖片) 的特色和製做
一.9.png格式的文件的特色
   與傳統的png 格式圖片相比, 9.png 格式圖片在圖片四周有一圈一個像素點組成的邊沿,該邊沿用於對圖片的可擴展區和內容
顯示區進行定義。這種格式的圖片在android 環境下具備自適應調節大小的能力。(1)容許開發人員定義可擴展區域,當須要延伸圖
片以填充比圖片自己更大區域時,可擴展區的內容被延展。(2)容許開發人員定義內容顯示區,用於顯示文字或其餘內容. 以下圖所示:
左側和上方的黑線交叉的部分便可擴展區域,右側和下方的黑線交叉的部分即內容顯示區.
                              
二 .9.png 圖片的製做
  android sdk 的 tools文件夾下提供了製做該格式圖片的工具 draw9patch.bat。使用此工具打開任意圖片以後,將鼠標置於圖片上。
  被黑色覆蓋的是不可編輯(鎖住)的區域,周圍的一圈一個像素的邊沿是可編輯區域。按住鼠標左鍵,在左側和上方的邊沿畫出可擴展區。
.net

 在右側和下方畫出內容顯示區。完成繪製之後,選擇file-> save ,便可保存爲 .9.png 格式的文件,並在android項目中使用。 code


代碼動態佈局: orm

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. //獲取屏幕高寬  
  2. DisplayMetrics metric = new DisplayMetrics();  
  3. getWindowManager().getDefaultDisplay().getMetrics(metric);  
  4. windowsHeight = metric.heightPixels;  
  5. windowsWight = metric.widthPixels;  
  6.    
  7. //動態改變佈局  
  8. LinearLayout production_factory = (LinearLayout)findViewById(R.id.production_factory);  
  9. LayoutParams params = production_factory.getLayoutParams();  
  10. params.height = windowsHeight / 2;  
  11. production_factory.setLayoutParams(params);  
一、屏幕相關概念  
1.1分辨率 
是指屏幕上有橫豎各有多少個像素 
1.2屏幕尺寸 
指的是手機實際的物理尺寸,好比經常使用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 
android將屏幕大小分爲四個級別(small,normal,large,and extra large)。 
1.3屏幕密度 
每英寸像素數 
手機能夠有相同的分辨率,但屏幕尺寸能夠不相同, 
Diagonal pixel表示對角線的像素值(=),DPI=933/3.7=252 
android將實際的屏幕密度分爲四個通用尺寸(low,medium,high,and extra high) 
通常狀況下的普通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi 
對於屏幕來講,dpi越大,屏幕的精細度越高,屏幕看起來就越清楚 
1.4密度無關的像素(Density-independent pixel——dip) 
dip是一種虛擬的像素單位 
dip和具體像素值的對應公式是dip/pixel=dpi值/160,也就是px = dp * (dpi / 160) 
當你定義應用的佈局的UI時應該使用dp單位,確保UI在不一樣的屏幕上正確顯示。 

手機屏幕分類和像素密度的對應關係如表1所示 
手機尺寸分佈狀況(http://developer.android.com/resources/dashboard/screens.html)如圖所示, 
目前主要是以分辨率爲800*480和854*480的手機用戶居多 
從以上的屏幕尺寸分佈狀況上看,其實手機只要考慮3-4.5寸之間密度爲1和1.5的手機 
二、android多屏幕支持機制  
Android的支持多屏幕機制即用爲當前設備屏幕提供一種合適的方式來共同管理並解析應用資源。 
Android平臺中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合適資源。 
指定大小(size-specific)的合適資源是指small, normal, large, and xlarge。 
指定密度(density-specific)的合適資源,是指ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high). 
Android有個自動匹配機制去選擇對應的佈局和圖片資源 
1)界面佈局方面 
   根據物理尺寸的大小準備5套佈局: 
    layout(放一些通用佈局xml文件,好比界面頂部和底部的佈局,不會隨着屏幕大小變化,相似windos窗口的title bar), 
    layout-small(屏幕尺寸小於3英寸左右的佈局),  
    layout-normal(屏幕尺寸小於4.5英寸左右), 
    layout-large(4英寸-7英寸之間), 
    layout-xlarge(7-10英寸之間)

小米3是5英寸,屬於layout-large

2)圖片資源方面 
  須要根據dpi值準備5套圖片資源: 
    drawable:主要放置xml配置文件或者對分辨率要求較低的圖片 
    drawalbe-ldpi:低分辨率的圖片,如QVGA (240x320) 
    drawable-mdpi:中等分辨率的圖片,如HVGA (320x480) 
    drawable-hdpi:高分辨率的圖片,如WVGA (480x800),FWVGA (480x854) 
    drawable-xhdpi:至少960dp x 720dp 

小米3:主屏分辨率 1920x1080像素 屏幕像素密度 441ppi

Android有個自動匹配機制去選擇對應的佈局和圖片資源。 
  系統會根據機器的分辨率來分別到這幾個文件夾裏面去找對應的圖片。 
  在開發程序時爲了兼容不一樣平臺不一樣屏幕,建議各自文件夾根據需求均存放不一樣版本圖片。 

三、AndroidManifest.xml 配置 
android從1.6和更高,Google爲了方便開發者對於各類分辨率機型的移植而增長了自動適配的功能 
          <supports-screens 
           android:largeScreens="true"  
            android:normalScreens="true" 
            android:smallScreens="true"  
            android:anyDensity="true"/> 
3.1是否支持多種不一樣密度的屏幕 
android:anyDensity=["true" | "false"] 
若是android:anyDensity="true" 
指應用程序支持不一樣密度,會根據屏幕的分辨率自動去匹配。 
若是android:anyDensity="false" 
應用程序支持不一樣密度,系統自動縮放圖片尺寸和這個圖片的座標。

具體解釋一下系統是如何自動縮放資源的。 
例如咱們在hdpi,mdpi,ldpi文件夾下擁有同一種資源,那麼應用也不會自動地去相應文件夾下尋找資源,這種狀況都是出如今高密度,以及低密度的手機上,好比說一部240×320像素的手機, 若是設置android:anyDensity="false",Android系統會將240 x 320(低密度)轉換爲 320×480(中密度),這樣的話,應用就會在小密度手機上加載mdpi文件中的資源。 

3.2是否支持大屏幕 
android:largeScreens=["true" | "false"] 
若是在聲明不支持的大屏幕,而這個屏幕尺寸是larger的話,系統使用尺寸爲("normal")和密度爲("medium)顯示, 
不過會出現一層黑色的背景。 
3.3是否支持小屏幕 
android:smallScreens=["true" | "false"] 
若是在聲明不支持的小屏幕,而當前屏幕尺寸是smaller的話,系統也使用尺寸爲("normal")和密度爲("medium)顯示 
若是應用程序能在小屏幕上正確縮放(最低是small尺寸或最小寬度320dp),那就不須要用到本屬性。不然,就應該爲最小屏幕寬度標識符設置本屬性 
來匹配應用程序所需的最小尺寸。 

四、Android提供3種方式處理屏幕自適應 
4.1預縮放的資源(基於尺寸和密度去尋找圖片) 
1)若是找到相應的尺寸和密度,則利用這些圖片進行無縮放顯示。 
2)若是無法找到相應的尺寸,而找到密度,則認爲該圖片尺寸爲 "medium",利用縮放顯示這個圖片。 
3)若是都沒法匹配,則使用默認圖片進行縮放顯示。默認圖片默認標配 "medium" (160)。 
4.2自動縮放的像素尺寸和座標(密度兼容) 
1)若是應用程序不支持不一樣密度android:anyDensity="false",系統自動縮放圖片尺寸和這個圖片的座標。 
2)對於預縮放的資源,當android:anyDensity="false",也不生效。 
3)android:anyDensity="false",只對密度兼容起做用,尺寸兼容沒效果 
4.3兼容更大的屏幕和尺寸(尺寸兼容) 
1)對於你在聲明不支持的大屏幕,而這個屏幕尺寸是normal的話,系統使用尺寸爲    ("normal")和密度爲("medium)顯示。 
2.)對於你在聲明不支持的大屏幕,而這個屏幕尺寸是larger的話,系統一樣使用尺寸爲("normal")和密度爲("medium)顯示, 
不過會出現一層黑色的背景。 

五、Android系統自動適配技巧 
Android系統採用下面兩種方法來實現應用的自動適配: 
1)佈局文件中定義長度的時候,最好使用wrap_content,fill_parent, 或者dp 進行描述,這樣能夠保證在屏幕上面展現的時候有合適的大小 
2)爲不一樣屏幕密度的手機,提供不一樣的位圖資源,可使得界面清晰無縮放。 
對應bitmap 資源來講,自動的縮放有時會形成放大縮小後的圖像變得模糊不清,這是就須要應用爲不一樣屏幕密度配置提供不一樣的資源:爲高密度的屏幕提供高清晰度的圖像等。 
3)不要使用AbsoluteLayout 
4)像素單位都使用DIP,文本單位使用SP 


六、在代碼中獲取屏幕像素、屏幕密度 
DisplayMetrics metric = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metric); 
int width = metric.widthPixels;  // 屏幕寬度(像素) 
int height = metric.heightPixels;  // 屏幕高度(像素) 
float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5) 
int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240) 


七、 通常多分辨率處理方法及其缺點 
7.1 圖片縮放 
基於當前屏幕的精度,平臺自動加載任何未經縮放的限定尺寸和精度的圖片。若是圖片不匹配,平臺會加載默認資源而且在放大或者縮小以後能夠知足當前界面的顯示要求。例如,當前爲高精度屏幕,平臺會加載高精度資源(如HelloAndroid中drawable-hdpi 中的位圖資源),若是沒有,平臺會將中精度資源縮放至高精度,致使圖片顯示不清晰。 
7.2 自動定義像素尺寸和位置 
若是程序不支持多種精度屏幕,平臺會自動定義像素絕對位置和尺寸值等,這樣就能保證元素能和精度160 的屏幕上同樣能顯示出一樣尺寸的效果。例如,要讓WVGA 高精度屏幕和傳統的HVGA 屏幕同樣顯示一樣尺寸的圖片,當程序不支持時,系統會對程序慌稱屏幕分辨率爲320×480,在(10,10)到(100,100)的區域內繪製圖形完成以後,系統會將圖形放大到(15,15)到(150,150)的屏幕顯示區域。 
7.3 兼容更大尺寸的屏幕 
當前屏幕超過程序所支持屏幕的上限時,定義supportsscreens元素,這樣超出顯示的基準線時,平臺在此顯示黑色的背景圖。例如,WVGA 中精度屏幕上,如程序不支持這樣的大屏幕,系統會謊稱是一個320×480 的,多餘的顯示區域會被填充成黑色。 
7.4 採用OpenGL 動態繪製圖片 
Android 底層提供了OpenGL 的接口和方法,能夠動態繪製圖片,可是這種方式對不熟悉計算機圖形學的開發者來說是一個很大的挑戰。通常開發遊戲,採用OpenGL 方式。 
7.5 多個apk 文件 
Symbian 和傳統的J2ME 就是採用這種方式,爲一款應用提供多個分辨率版本,用戶根據本身的需求下載安裝相應的可執行文件。針對每一種屏幕單獨開發應用程序不失爲一種好方法,可是目前Google Market 對一個應用程序多個分辨率版本的支持還不完善,開發者仍是須要儘量使用一個apk 文件適應多個分辨率。 

相關文章
相關標籤/搜索