android 自適應 多螢幕支援

2021-06-16 11:06:05 字數 4423 閱讀 9153

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所示

手機尺寸分布情況(如圖所示,

目前主要是以解析度為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套資源:

drawalbe-ldpi:低解析度的,如qvga (240x320)

drawable-mdpi:中等解析度的,如hvga (320x480)

drawable-hdpi:高解析度的,如wvga (480x800),fwvga (480x854)

drawable-xhdpi:至少960dp x 720dp

android有個自動匹配機制去選擇對應的布局和資源。

系統會根據機器的解析度來分別到這幾個資料夾裡面去找對應的。

在開發程式時為了相容不同平台不同螢幕,建議各自資料夾根據需求均存放不同版本。

3、androidmanifest.xml 配置

ndroid從1.6和更高,google為了方便開發者對於各種解析度機型的移植而增加了自動適配的功能

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、 一般多解析度處理方法及其缺點出處:

android 自適應 多螢幕支援

android 自適應 多螢幕支援 1 螢幕相關概念 1.1解析度 是指螢幕上有橫豎各有多少個畫素 1.2螢幕尺寸 手機螢幕尺寸指的是手機實際的物理尺寸,即螢幕的實際大小。android將螢幕大小分為四個級別 small,normal,large,and extra large 1.3螢幕密度dpi...

android 螢幕自適應

細說 layout weight 目前最為推薦的 android多螢幕自適應解決方案。該屬性的作用是決定控制項在其父布局中的顯示權重,一般用於線性布局中。其值越小,則對應的layout width或layout height的優先順序就越高,一般橫向布局中,決定的是 layout width 的優先...

Android螢幕自適應解析

先了解下api中的工具類 android.util.displaymetrics 最主要的顯示引數。獲得displaymetrics可以通過2種方式 1.在activity中使用activity.getresources getdisplaymetrics 2.新建乙個例項,通過display類的工...