android系統如何自適應螢幕大小

來源:互聯網
上載者:User

1、螢幕相關概念
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的手機
2、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英寸之間)
2)圖片資源方面
  需要根據dpi值準備5套圖片資源:
    drawable:主要放置xml設定檔或者對解析度要求較低的圖片
    drawalbe-ldpi:低解析度的圖片,如QVGA (240x320)
    drawable-mdpi:中等解析度的圖片,如HVGA (320x480)
    drawable-hdpi:高解析度的圖片,如WVGA (480x800),FWVGA (480x854)
    drawable-xhdpi:至少960dp x 720dp
Android有個自動匹配機制去選擇對應的布局和圖片資源。
系統會根據機器的解析度來分別到這幾個檔案夾裡面去找對應的圖片。
在開發程式時為了相容不同平台不同螢幕,建議各自檔案夾根據需求均存放不同版本圖片。
3、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),那就不需要用到本屬性。否則,就應該為最小螢幕寬度標識符設定本屬性
來匹配應用程式所需的最小尺寸。
4、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)顯示,
不過會出現一層黑色的背景。
5、Android系統自動適配技巧
Android系統採用下面兩種方法來實現應用的自動適配:
1)布局檔案中定義長度的時候,最好使用wrap_content,fill_parent, 或者dp 進行描述,這樣可以保證在螢幕上面展示的時候有合適的大小
2)為不同螢幕密度的手機,提供不同的位元影像資源,可以使得介面清晰無縮放。
對應bitmap 資源來說,自動的縮放有時會造成放大縮小後的映像變得模糊不清,這是就需要應用為不同螢幕密度配置提供不同的資源:為高密度的螢幕提供高清晰度的映像等。
3)不要使用AbsoluteLayout
4)像素單位都使用DIP,文本單位使用SP
6、在代碼中擷取螢幕像素、螢幕密度
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、 一般多解析度處理方法及其缺點
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 檔案適應多個解析度。

出處:http://blog.sina.com.cn/staratsky

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.