android中適配是一件很棘手的事情,本篇文章詳細的介紹螢幕顯示的原理,為什麼會資源檔案中會存在
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi等資料夾,為什麼要使用dp作為單位等等。
首先從這兩張的顯示效果開始說起
這是一張200x200的在不同的手機上的顯示效果。很明顯第二張看上去要比第一張占用的空間小很多?這是為什麼呢?
這裡我們引入 ppi (pixel per inch)名詞,翻譯過來就是每英吋的距離畫素點的個數。現在來解釋上面的現象。對於一張200x200畫素的,我國我們想要顯示在 200ppi 的手機上,那麼占用螢幕的長和寬均為 200pix / (200pix / inch) = 1 inch ,也就是說要占用 1 inch x 1 inch,如果要顯示在 300ppi 的手機上,那麼占用螢幕的長和寬均為 200pix / (300pix / inch ) = 2/3 inch,也就是說對於 ppi越高的手機,單位inch上能夠顯示更多的畫素點,因此當這兩種手機顯示同樣多的畫素點的時候,ppi 越高的手機占用的空間就越小。這就是我們想要在各種手機螢幕上都顯示一致的效果時需要解決的問題。
既然這種效果不是我們想要的,怎麼做才能獲取一致的顯示效果呢?下面介紹三種方法
方法一:對每一中不同的ppi使用不同的,這需要我們先判斷螢幕的ppi,再對進行處理,然後顯示,顯然比較麻煩。而且對於獲取螢幕ppi這個引數android並沒有提供給我們api呼叫。所以這種辦法基本行不通
方法二: 在用eclipse開發環境生成乙個android專案後,系統會給我們生成drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,對於同一張資源,我們分別建立這五個版本來適應不同的螢幕。假設你想一張
在 200ppi和400ppi的手機上顯示的長和寬都是一樣的為 1inch x 1inch,那麼你就需要製作一張200x200的和一張
400x400的,然後放入對應得drawable目錄中就可以了。那麼程式執行時怎麼知道自己到底是使用哪個drawable目錄下
的呢?這個是不需要我們考慮的,而是手機廠商考慮的問題,只需要知道,程式會使用適應當前螢幕的目錄下的
資源。drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,這幾個目錄對應的pppi為
120ppi 160ppi 240ppi 320ppi 480ppi ,也就是說如果螢幕的ppi為320,那麼就會優先使用drawable-xhdpi目錄下的
資源。當然手機螢幕的ppi也是多種多樣,例如有的是 300ppi,有的是220ppi,這個系統會選擇最接近的目錄,也就
是 300ppi的手機會選擇320ppi對應的drawable目錄下的資源
方法三:方法2中需要為每個drawable目錄都生成對應的版本,如果較多的話,生成不同版本的倒是小事更主要的缺點是會增大應用的大小,那麼可不可以只在乙個目錄下存放,例如只在drawable-mdpi目錄下存放呢答案是可以的,假設我們在drawable-hdpi(對應的ppi為160ppi)目錄下存放了乙個100x100的,那麼當需要
在320ppi的android裝置上進行顯示時,android系統會將自動將進行處理生成乙個200x200的顯示到裝置上,那麼他們占用的空間大小分別為 100/160 = 3/5 inch 200/320 = 3/5 inch 可以看出他們占用的長和寬都是一樣的這種自動縮放的優點是只需要一張就能適應各種ppi型別的螢幕。缺點是當對100x100的進行變換成200x200的時肯能會造成的不清晰,如果提供乙個drawable-xhdpi下的資源,較多的話會無形增加應用的大小,所以說如何進行選擇也是乙個衡量。建議是將比較重要的資源提供多個版本(當android裝置和自己的ppi相對應的drawable下找到想要的資源時,就不會再到其他目錄需找資源)。不是很重要的資源儲存乙個版本,讓系統根據自己的ppi自己對進行適當的縮放顯示。
最後再說下為什麼在布局檔案中使用 dp作為單位而不是使用px
dp是乙個與螢幕ppi無關的引數,同時也是乙個事實上並不存在的虛擬單位。顯示時會根據具體螢幕的ppi進行畫素的對映,關係如下160ppi 1dp 1px120ppi 1dp 0.75px240ppi
1dp 1.5px320ppi 1dp 2px因此在布局檔案中一般使用dp作為單位,這樣就能適應不同ppi的螢幕,在各種ppi的螢幕上有一樣大的物理上的距離。(可以看出1dp並不總是等於1px的,對於ppi高的螢幕肯能要等於2px,只是為了物理上看起來的距離是相等的)
最後希望大家能夠明白 我們經常說的解析度和ppi的關係,其實他們是沒多大關係。解析度只是說明螢幕上有多少個畫素點,這也跟螢幕大小有關係。當然對於螢幕大小相同的來講 解析度越高 ppi越大,如果脫離了螢幕的物理尺寸談解析度是沒有任何意義的。就像平板的解析度比手機的大,那是因為平板個大呀。從顏色顯示的細膩程度上講並不見得比手機強。
常見單位解析:
px我們應該是比較熟悉的,前面的解析度就是用的畫素為單位,大多數情況下,比如ui設計、android原生api都會以px作為統一的計量單位,像是獲取螢幕寬高等。
dip和dp是乙個意思,都是density independent pixels的縮寫,即密度無關畫素,上面我們說過,dpi是螢幕畫素密度,假如一英吋裡面有160個畫素,這個螢幕的畫素密度就是160dpi,那麼在這種情況下,dp和px如何換算呢?在android中,規定以160dpi為基準,1dip=1px,如果密度是320dpi,則1dip=2px,以此類推。
假如同樣都是畫一條320px的線,在480*800解析度手機上顯示為2/3螢幕寬度,在320*480的手機上則佔滿了全屏,如果使用dp為單位,在這兩種解析度下,160dp都顯示為螢幕一般的長度。這也是為什麼在android開發中,寫布局的時候要盡量使用dp而不是px的原因。
而sp,即scale-independent pixels,與dp類似,但是可以根據文字大小首選項進行放縮,是設定字型大小的御用單位。
螢幕尺寸指螢幕的對角線的長度,單位是英吋,1英吋=2.54厘公尺
最後給出幾種軟體自帶的屬性:
名稱畫素密度範圍
mdpi
120dpi~160dpi
hdpi
160dpi~240dpi
xhdpi
240dpi~320dpi
xxhdpi
320dpi~480dpi
***hdpi
480dpi~640dpi
android 螢幕適配理解
1.手機螢幕要素 手機 m2 解析度 1080x1920 手機寬度和長度的畫素數 螢幕尺寸 手機螢幕對角線長度 8寸 螢幕密度 dpi 螢幕每英吋的畫素數 計算公式 1080平方 1920平方 再開平方 8寸 275.36 dpi density 密度 android中規定 160px 英吋,就是每...
android螢幕適配
1 配置android應用程式適配在不同的手機上,需要在androidmanifest.xml檔案的manifest標籤中新增子元素 1 2 3 4 5 6 7 8 9 10 manifestxmlns android supports screens android smallscreens tr...
Android螢幕適配
在sdk中的幫助文件中。develpe training best practices supporting multiple screens 這裡有多屏適配的介紹。現做簡單記錄。screen size small 至少 426dp x 320dp normal 至少 470dp x 320dp l...