android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度
為什么要適配,適配的好處等等這里就不說(shuō)了,直接說(shuō)我們要怎么適配,請(qǐng)看下面的內(nèi)容。
1.重要概念
px:pixel,像素Android原生API,UI設(shè)計(jì)計(jì)量單位,如獲取屏幕寬高。
屏幕分辨率:指在縱向和橫向方向上的像素點(diǎn)數(shù),單位是px,一般顯示方式是縱向像素?cái)?shù)量*橫向像素?cái)?shù)量,如1920*1080。
屏幕尺寸:一般是屏幕對(duì)角線長(zhǎng)度,單位是英寸,常見(jiàn)尺寸有3.5,4.0,4.3,4.7,5.0,6.0等。
屏幕像素密度:ppi pixel per inch的縮寫,意思是每英寸屏幕上的像素?cái)?shù),因?yàn)槠聊怀叽缡巧碳疑a(chǎn)時(shí)就規(guī)定好的,屏幕尺寸一樣的手機(jī),屏幕寬高卻不一定一樣,所以通常取屏幕對(duì)角線像素?cái)?shù)量和屏幕尺寸(屏幕對(duì)角線長(zhǎng)度)來(lái)計(jì)算屏幕像素密度,計(jì)算公式就是通過(guò)勾股定理和分辨率計(jì)算得到屏幕對(duì)角線像素?cái)?shù)量,再除以屏幕尺寸。手機(jī)參數(shù)上也會(huì)有這個(gè)數(shù)值。
dpi:dot per inch點(diǎn)像素密度,它的計(jì)算方法也和ppi一樣,但從很多方面上,dpi是和ppi有區(qū)別的,ppi是用在設(shè)備上的單位,比如顯示器;而dpi是用在印刷品上的單位,比如要打印一幅地圖;在圖像上的像素看起來(lái)是一個(gè)個(gè)點(diǎn)或者方塊,這時(shí)候通常就將兩者混用。要注意的是,我們并不能在Android適配時(shí)直接使用手機(jī)參數(shù)上的ppi值,而是使用dpi,Android對(duì)dpi根據(jù)大小做了規(guī)定的分檔,以160dpi為基準(zhǔn),分為ldpi(120dpi)、mdpi(160dpi)、hdpi(240dpi)、xhdpi(320dpi)、xxhdpi(480dpi)等,當(dāng)然現(xiàn)在手機(jī)的分辨率和尺寸更加多,像560dpi,600dpi也有,舉個(gè)例子,Nexus 6 ppi是493,那按道理我們計(jì)算出來(lái)的dpi也是493,但Android的分檔里面并沒(méi)有493dpi,所以實(shí)際上它的dpi是560,而這個(gè)值我們是可以在手機(jī)的系統(tǒng)文件里面修改的。一定程度上,我們甚至可以說(shuō)分辨率和適配沒(méi)有關(guān)系,我們需要考慮的是dpi值,而這個(gè)值是可以與分辨率沒(méi)有關(guān)系的,是手機(jī)廠家設(shè)的。
dp/dip:density independent pixels密度無(wú)關(guān)像素,Android設(shè)計(jì)的一個(gè)單位,它與px存在一個(gè)換算關(guān)系,Android規(guī)定,在160dpi時(shí),1dp等于1px,那么320dpi時(shí),1dp就等于2px,
所以當(dāng)px換算為dp時(shí),dp =160 * px / dpi;dp換算為px時(shí),px = dp * dpi /160。換算方法代碼:
px與dp的相互換算
sp:scale independent pixels比例無(wú)關(guān)像素,是Android推薦使用的字體大小單位,同樣是密度無(wú)關(guān),而且看上去似乎使用dp也沒(méi)問(wèn)題(以前的Android開發(fā)很多是這樣寫)但是,原因就在比例上,字體除了數(shù)值設(shè)置外,還受到系統(tǒng)字體大小設(shè)置的影響,而使用sp是適應(yīng)這種變化的,dp則不會(huì)跟隨系統(tǒng)字體大小設(shè)置的變化而變化,所以除非你想字體大小不隨著系統(tǒng)字體大小設(shè)置變化,字體大小單位都使用sp。但是sp與設(shè)計(jì)圖上px的轉(zhuǎn)換可以使用dp與px的換算公式。
2.適配
適配方案有很多種,比如百分比布局,比如根據(jù)每個(gè)要適配的屏幕都寫一套布局,比如分辨率等比縮放等。但都有這樣那樣的問(wèn)題,Apk體積增大,難以維護(hù)……我個(gè)人比較推薦以下的做法:
多個(gè)demins(dp寫法)
我們可以把控件的大小數(shù)值寫在多個(gè)dimens xml文件中,讓應(yīng)用顯示控件大小的時(shí)候像獲取圖片資源一樣,根據(jù)規(guī)則選擇具體的值。而dimens文件在values文件夾下,其實(shí)就是應(yīng)用到不同的values文件夾下的dimens文件中讀取到需要的值。但這個(gè)“規(guī)則”的設(shè)置就是最考驗(yàn)適配技巧的時(shí)候了,訣竅在于我們?cè)趺慈ッ鹶alues文件夾和對(duì)設(shè)計(jì)稿上控件大小進(jìn)行符合“規(guī)則”的單位換算。讓我們來(lái)看一下怎么去做?
values文件夾根據(jù)限定符去命名
屏幕尺寸:指最短的可用屏幕區(qū)域。如sw480dp,表示適配可用屏幕尺寸起碼為480dp的情況。
屏幕分辨率:必須較大數(shù)值在前,較小數(shù)值在后,如1920x1080,表示適配分辨率為1920x1080的情況,其中x是英文字母x而不是乘號(hào)。
屏幕像素密度:如mdpi,表示適配屏幕像素密度值近似或等于mdpi(160dpi)的情況。
屏幕方向:如land(橫向)、port(豎向)表示適配屏幕方向?yàn)閘and或者port的情況。
版本:vX(X代表版本號(hào),現(xiàn)在是1到23),表示適配SDK版本為X的情況。
還有很多這里就不一一細(xì)說(shuō)了。
限定符可以組合起來(lái)使用來(lái)限定更精確的情況如:values-mdpi-land-1920×1080-v19,表示適配SDK版本為19,分辨率為1920×1080的橫向屏幕的mdpi手機(jī)。
學(xué)過(guò)組合的都知道這里能有多少種限定符組合,而且其中分辨率的值還是不定的,只要有廠家生產(chǎn)不同分辨率的手機(jī),我們就可以有無(wú)數(shù)種限定符組合,然而,我們并不用懼怕,限定符的適配是向下匹配的,譬如:有values-port-1920x1080的手機(jī)屏幕需要適配,當(dāng)我們建立的values文件夾里面沒(méi)有一樣的時(shí)候,就適配到下一級(jí),比如values-port-1280x720(如果有而且是最接近目標(biāo)的話),如果還沒(méi)有,一直向下,最后起碼能適配到values這個(gè)沒(méi)有限定符的。
這里現(xiàn)在只考慮豎屏的時(shí)候(橫屏就是增加land限定符,而且數(shù)值變化太大,布局也可能需要專門去寫,適配的原理還是一樣的,這里就以豎屏為例)根據(jù)以下的例子:
1.UI給我們做了一套1920x1080的圖片,通常將該分辨率的圖片放在drawable-xxhdpi的文件夾下,應(yīng)為通常分辨率為1920x1080的屏幕都是xxhdpi(480dpi)的。
2.這時(shí)候,圖片上有一個(gè)90x30(px)的控件,在1920x1080的機(jī)子的布局里面根據(jù)換算方法轉(zhuǎn)換成30x10(dp)而xhdpi(320dpi)的1280x720上是多少呢?設(shè)在該屏幕上的長(zhǎng)為A像素(px),根據(jù)比例式,A/720=30/1080,那么就知道A為20px,那么根據(jù)換算公式,dp還是10!
3.我們?cè)賮?lái)看看兩個(gè)機(jī)子它們的sw是多少dp?選短邊計(jì)算,1080/480/160=360,720/320/160=360,那么結(jié)合第二點(diǎn)來(lái)看,只要sw相同,無(wú)論具體的在屏幕上顯示的px是多少,dp都是相同的,dp相同,代表視覺(jué)大小是相同的,意味著我們看到的布局效果是一樣的,適配解決!
所以我們只需要使用規(guī)則給values文件夾命名如下:values-swXXXdp,就可以了。大概像這樣:
values文件夾命名
可能有人有疑問(wèn)了,那么如果遇上一些超級(jí)奇葩的廠家給機(jī)子設(shè)置了很奇葩的dpi值呢,單靠這個(gè)規(guī)則就真的OK嗎?
譬如:遇上分辨率為1980x1080,但dpi是mdpi的屏幕時(shí),這臺(tái)機(jī)子的尺寸就是短邊1080/160/160=1080dp,那么我們只需要建立一個(gè)values-sw1080dp的文件夾,具體的dp值就是控件長(zhǎng)的px值B = 30/1080*1080 = 30,dp = 30 / (160/160 )= 30,這并沒(méi)有什么問(wèn)題。
其實(shí)可以看出來(lái),這不是分辨率等比縮放的寫法嗎?只不過(guò)把等比縮放之后的分辨率再根據(jù)換算方法將px換成dp罷了。但是!分辨率可以有無(wú)窮多種,而以下是可以使用的通用屏幕尺寸的一些值:
1.320,針對(duì)以下屏幕配置的設(shè)備:
240x320ldpi(QVGA手持設(shè)備)
320x480mdpi(手持設(shè)備)
480x800hdpi(高分辨率手持設(shè)備)
2.480,針對(duì)480x800mdpi的屏幕(平板或手持設(shè)備)
3.600,針對(duì)600x1024mdip的屏幕(7英寸平板)
4.720,針對(duì)720x1280mdip的屏幕(10英寸平板)
注意:當(dāng)應(yīng)用程序提供了多個(gè)帶有不同值的最小寬度限定符資源目錄時(shí),系統(tǒng)會(huì)使用最接近(不超出)設(shè)備最小寬度的那個(gè)資源。這個(gè)限定符被添加在API級(jí)別13中。還要看android:requiresSmallestWidthDp屬性,它聲明了與你的應(yīng)用程序兼容的最小的最小寬度,并且smallestScreenWidthDp配置字段會(huì)持有這個(gè)設(shè)備最小寬度的值。
那么我們的靈活性就大大提高的同時(shí),相對(duì)于少則十幾多則數(shù)十的分辨率種類,會(huì)使用近似值的sw-XXXdp寫法就只需要少于十種的就可以搞定了。
當(dāng)然,按照前面說(shuō)的限定符規(guī)則,在sw-XXXdp的基礎(chǔ)上,我們還可以加上版本號(hào),屏幕方向去針對(duì)某些系統(tǒng)版本的手機(jī)或者平板,同樣是比使用分辨率的少很多。
最后的問(wèn)題就是就算要處理的只有幾個(gè)dimens文件,但每個(gè)里面可能有十分多的值,一個(gè)個(gè)換算,新建,修改,簡(jiǎn)直是折磨人的,但既然我們知道了換算的規(guī)則,知道了dimens的調(diào)用規(guī)則,寫個(gè)方法去修改xml的文件內(nèi)容是很簡(jiǎn)單的,代碼請(qǐng)下載(這里要感謝柯鏗!):Android屏幕適配
總結(jié)
以上是生活随笔為你收集整理的android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 抖音发布春节期间反诈提醒,注意春节红包类
- 下一篇: android长按加入购物车,《Andr