Android屏幕適配——多分辨率多屏幕密度

為什么要適配,適配的好處等等這里就不說了,直接說我們要怎么適配,請看下面的內(nèi)容。

1.重要概念

px:pixel,像素Android原生API,UI設(shè)計(jì)計(jì)量單位,如獲取屏幕寬高。

屏幕分辨率:指在縱向和橫向方向上的像素點(diǎn)數(shù),單位是px,一般顯示方式是縱向像素數(shù)量*橫向像素數(shù)量,如1920*1080。

屏幕尺寸:一般是屏幕對角線長度,單位是英寸,常見尺寸有3.5,4.0,4.3,4.7,5.0,6.0等。

屏幕像素密度:ppi pixel per inch的縮寫,意思是每英寸屏幕上的像素數(shù),因?yàn)槠聊怀叽缡巧碳疑a(chǎn)時就規(guī)定好的,屏幕尺寸一樣的手機(jī),屏幕寬高卻不一定一樣,所以通常取屏幕對角線像素數(shù)量和屏幕尺寸(屏幕對角線長度)來計(jì)算屏幕像素密度,計(jì)算公式就是通過勾股定理和分辨率計(jì)算得到屏幕對角線像素數(shù)量,再除以屏幕尺寸。手機(jī)參數(shù)上也會有這個數(shù)值。

dpi:dot per inch點(diǎn)像素密度,它的計(jì)算方法也和ppi一樣,但從很多方面上,dpi是和ppi有區(qū)別的,ppi是用在設(shè)備上的單位,比如顯示器;而dpi是用在印刷品上的單位,比如要打印一幅地圖;在圖像上的像素看起來是一個個點(diǎn)或者方塊,這時候通常就將兩者混用。要注意的是,我們并不能在Android適配時直接使用手機(jī)參數(shù)上的ppi值,而是使用dpi,Android對dpi根據(jù)大小做了規(guī)定的分檔,以160dpi為基準(zhǔn),分為ldpi(120dpi)、mdpi(160dpi)、hdpi(240dpi)、xhdpi(320dpi)、xxhdpi(480dpi)等,當(dāng)然現(xiàn)在手機(jī)的分辨率和尺寸更加多,像560dpi,600dpi也有,舉個例子,Nexus 6 ppi是493,那按道理我們計(jì)算出來的dpi也是493,但Android的分檔里面并沒有493dpi,所以實(shí)際上它的dpi是560,而這個值我們是可以在手機(jī)的系統(tǒng)文件里面修改的。一定程度上,我們甚至可以說分辨率和適配沒有關(guān)系,我們需要考慮的是dpi值,而這個值是可以與分辨率沒有關(guān)系的,是手機(jī)廠家設(shè)的。

dp/dip:density independent pixels密度無關(guān)像素,Android設(shè)計(jì)的一個單位,它與px存在一個換算關(guān)系,Android規(guī)定,在160dpi時,1dp等于1px,那么320dpi時,1dp就等于2px,

所以當(dāng)px換算為dp時,dp =160 * px / dpi;dp換算為px時,px = dp * dpi /160。換算方法代碼:

px與dp的相互換算

sp:scale independent pixels比例無關(guān)像素,是Android推薦使用的字體大小單位,同樣是密度無關(guān),而且看上去似乎使用dp也沒問題(以前的Android開發(fā)很多是這樣寫)但是,原因就在比例上,字體除了數(shù)值設(shè)置外,還受到系統(tǒng)字體大小設(shè)置的影響,而使用sp是適應(yīng)這種變化的,dp則不會跟隨系統(tǒng)字體大小設(shè)置的變化而變化,所以除非你想字體大小不隨著系統(tǒng)字體大小設(shè)置變化,字體大小單位都使用sp。但是sp與設(shè)計(jì)圖上px的轉(zhuǎn)換可以使用dp與px的換算公式。


2.適配

適配方案有很多種,比如百分比布局,比如根據(jù)每個要適配的屏幕都寫一套布局,比如分辨率等比縮放等。但都有這樣那樣的問題,Apk體積增大,難以維護(hù)……我個人比較推薦以下的做法:

多個demins(dp寫法)

我們可以把控件的大小數(shù)值寫在多個dimens xml文件中,讓應(yīng)用顯示控件大小的時候像獲取圖片資源一樣,根據(jù)規(guī)則選擇具體的值。而dimens文件在values文件夾下,其實(shí)就是應(yīng)用到不同的values文件夾下的dimens文件中讀取到需要的值。但這個“規(guī)則”的設(shè)置就是最考驗(yàn)適配技巧的時候了,訣竅在于我們怎么去命名values文件夾和對設(shè)計(jì)稿上控件大小進(jìn)行符合“規(guī)則”的單位換算。讓我們來看一下怎么去做?

values文件夾根據(jù)限定符去命名

屏幕尺寸:指最短的可用屏幕區(qū)域。如sw480dp,表示適配可用屏幕尺寸起碼為480dp的情況。

屏幕分辨率:必須較大數(shù)值在前,較小數(shù)值在后,如1920x1080,表示適配分辨率為1920x1080的情況,其中x是英文字母x而不是乘號。

屏幕像素密度:如mdpi,表示適配屏幕像素密度值近似或等于mdpi(160dpi)的情況。

屏幕方向:如land(橫向)、port(豎向)表示適配屏幕方向?yàn)閘and或者port的情況。

版本:vX(X代表版本號,現(xiàn)在是1到23),表示適配SDK版本為X的情況。

還有很多這里就不一一細(xì)說了。

限定符可以組合起來使用來限定更精確的情況如:values-mdpi-land-1920×1080-v19,表示適配SDK版本為19,分辨率為1920×1080的橫向屏幕的mdpi手機(jī)。

學(xué)過組合的都知道這里能有多少種限定符組合,而且其中分辨率的值還是不定的,只要有廠家生產(chǎn)不同分辨率的手機(jī),我們就可以有無數(shù)種限定符組合,然而,我們并不用懼怕,限定符的適配是向下匹配的,譬如:有values-port-1920x1080的手機(jī)屏幕需要適配,當(dāng)我們建立的values文件夾里面沒有一樣的時候,就適配到下一級,比如values-port-1280x720(如果有而且是最接近目標(biāo)的話),如果還沒有,一直向下,最后起碼能適配到values這個沒有限定符的。

這里現(xiàn)在只考慮豎屏的時候(橫屏就是增加land限定符,而且數(shù)值變化太大,布局也可能需要專門去寫,適配的原理還是一樣的,這里就以豎屏為例)根據(jù)以下的例子:

1.UI給我們做了一套1920x1080的圖片,通常將該分辨率的圖片放在drawable-xxhdpi的文件夾下,應(yīng)為通常分辨率為1920x1080的屏幕都是xxhdpi(480dpi)的。

2.這時候,圖片上有一個90x30(px)的控件,在1920x1080的機(jī)子的布局里面根據(jù)換算方法轉(zhuǎn)換成30x10(dp)而xhdpi(320dpi)的1280x720上是多少呢?設(shè)在該屏幕上的長為A像素(px),根據(jù)比例式,A/720=30/1080,那么就知道A為20px,那么根據(jù)換算公式,dp還是10!

3.我們再來看看兩個機(jī)子它們的sw是多少dp?選短邊計(jì)算,1080/480/160=360,720/320/160=360,那么結(jié)合第二點(diǎn)來看,只要sw相同,無論具體的在屏幕上顯示的px是多少,dp都是相同的,dp相同,代表視覺大小是相同的,意味著我們看到的布局效果是一樣的,適配解決!

所以我們只需要使用規(guī)則給values文件夾命名如下:values-swXXXdp,就可以了。大概像這樣:


values文件夾命名

可能有人有疑問了,那么如果遇上一些超級奇葩的廠家給機(jī)子設(shè)置了很奇葩的dpi值呢,單靠這個規(guī)則就真的OK嗎?

譬如:遇上分辨率為1980x1080,但dpi是mdpi的屏幕時,這臺機(jī)子的尺寸就是短邊1080/160/160=1080dp,那么我們只需要建立一個values-sw1080dp的文件夾,具體的dp值就是控件長的px值B = 30/1080*1080 = 30,dp = 30 / (160/160 )= 30,這并沒有什么問題。

其實(shí)可以看出來,這不是分辨率等比縮放的寫法嗎?只不過把等比縮放之后的分辨率再根據(jù)換算方法將px換成dp罷了。但是!分辨率可以有無窮多種,而以下是可以使用的通用屏幕尺寸的一些值:

1.320,針對以下屏幕配置的設(shè)備:

240x320ldpi(QVGA手持設(shè)備)

320x480mdpi(手持設(shè)備)

480x800hdpi(高分辨率手持設(shè)備)

2.480,針對480x800mdpi的屏幕(平板或手持設(shè)備)

3.600,針對600x1024mdip的屏幕(7英寸平板)

4.720,針對720x1280mdip的屏幕(10英寸平板)

注意:當(dāng)應(yīng)用程序提供了多個帶有不同值的最小寬度限定符資源目錄時,系統(tǒng)會使用最接近(不超出)設(shè)備最小寬度的那個資源。這個限定符被添加在API級別13中。還要看android:requiresSmallestWidthDp屬性,它聲明了與你的應(yīng)用程序兼容的最小的最小寬度,并且smallestScreenWidthDp配置字段會持有這個設(shè)備最小寬度的值。

那么我們的靈活性就大大提高的同時,相對于少則十幾多則數(shù)十的分辨率種類,會使用近似值的sw-XXXdp寫法就只需要少于十種的就可以搞定了。

當(dāng)然,按照前面說的限定符規(guī)則,在sw-XXXdp的基礎(chǔ)上,我們還可以加上版本號,屏幕方向去針對某些系統(tǒng)版本的手機(jī)或者平板,同樣是比使用分辨率的少很多。

最后的問題就是就算要處理的只有幾個dimens文件,但每個里面可能有十分多的值,一個個換算,新建,修改,簡直是折磨人的,但既然我們知道了換算的規(guī)則,知道了dimens的調(diào)用規(guī)則,寫個方法去修改xml的文件內(nèi)容是很簡單的,代碼請下載(這里要感謝柯鏗?。?a target="_blank" rel="nofollow">Android屏幕適配

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容