為什么要適配,適配的好處等等這里就不說了带到,直接說我們要怎么適配昧碉,請看下面的內(nèi)容。
1.重要概念
px:pixel揽惹,像素Android原生API被饿,UI設計計量單位,如獲取屏幕寬高搪搏。
屏幕分辨率:指在縱向和橫向方向上的像素點數(shù)狭握,單位是px,一般顯示方式是縱向像素數(shù)量*橫向像素數(shù)量疯溺,如1920*1080论颅。
屏幕尺寸:一般是屏幕對角線長度,單位是英寸囱嫩,常見尺寸有3.5嗅辣,4.0躏仇,4.3乒躺,4.7,5.0西剥,6.0等。
屏幕像素密度:ppi pixel per inch的縮寫蛙奖,意思是每英寸屏幕上的像素數(shù)潘酗,因為屏幕尺寸是商家生產(chǎn)時就規(guī)定好的,屏幕尺寸一樣的手機雁仲,屏幕寬高卻不一定一樣仔夺,所以通常取屏幕對角線像素數(shù)量和屏幕尺寸(屏幕對角線長度)來計算屏幕像素密度,計算公式就是通過勾股定理和分辨率計算得到屏幕對角線像素數(shù)量攒砖,再除以屏幕尺寸缸兔。手機參數(shù)上也會有這個數(shù)值。
dpi:dot per inch點像素密度吹艇,它的計算方法也和ppi一樣惰蜜,但從很多方面上,dpi是和ppi有區(qū)別的受神,ppi是用在設備上的單位抛猖,比如顯示器;而dpi是用在印刷品上的單位鼻听,比如要打印一幅地圖财著;在圖像上的像素看起來是一個個點或者方塊,這時候通常就將兩者混用撑碴。要注意的是撑教,我們并不能在Android適配時直接使用手機參數(shù)上的ppi值,而是使用dpi醉拓,Android對dpi根據(jù)大小做了規(guī)定的分檔伟姐,以160dpi為基準,分為ldpi(120dpi)廉嚼、mdpi(160dpi)玫镐、hdpi(240dpi)倒戏、xhdpi(320dpi)怠噪、xxhdpi(480dpi)等,當然現(xiàn)在手機的分辨率和尺寸更加多杜跷,像560dpi傍念,600dpi也有,舉個例子葛闷,Nexus 6 ppi是493憋槐,那按道理我們計算出來的dpi也是493,但Android的分檔里面并沒有493dpi淑趾,所以實際上它的dpi是560阳仔,而這個值我們是可以在手機的系統(tǒng)文件里面修改的。一定程度上扣泊,我們甚至可以說分辨率和適配沒有關系近范,我們需要考慮的是dpi值嘶摊,而這個值是可以與分辨率沒有關系的,是手機廠家設的评矩。
dp/dip:density independent pixels密度無關像素叶堆,Android設計的一個單位,它與px存在一個換算關系斥杜,Android規(guī)定虱颗,在160dpi時,1dp等于1px蔗喂,那么320dpi時忘渔,1dp就等于2px,
所以當px換算為dp時弱恒,dp =160 * px / dpi辨萍;dp換算為px時,px = dp * dpi /160返弹。換算方法代碼:
sp:scale independent pixels比例無關像素锈玉,是Android推薦使用的字體大小單位,同樣是密度無關义起,而且看上去似乎使用dp也沒問題(以前的Android開發(fā)很多是這樣寫)但是拉背,原因就在比例上,字體除了數(shù)值設置外默终,還受到系統(tǒng)字體大小設置的影響椅棺,而使用sp是適應這種變化的,dp則不會跟隨系統(tǒng)字體大小設置的變化而變化齐蔽,所以除非你想字體大小不隨著系統(tǒng)字體大小設置變化两疚,字體大小單位都使用sp。但是sp與設計圖上px的轉(zhuǎn)換可以使用dp與px的換算公式含滴。
2.適配
適配方案有很多種诱渤,比如百分比布局,比如根據(jù)每個要適配的屏幕都寫一套布局谈况,比如分辨率等比縮放等勺美。但都有這樣那樣的問題,Apk體積增大碑韵,難以維護……我個人比較推薦以下的做法:
多個demins(dp寫法)
我們可以把控件的大小數(shù)值寫在多個dimens xml文件中赡茸,讓應用顯示控件大小的時候像獲取圖片資源一樣,根據(jù)規(guī)則選擇具體的值祝闻。而dimens文件在values文件夾下占卧,其實就是應用到不同的values文件夾下的dimens文件中讀取到需要的值。但這個“規(guī)則”的設置就是最考驗適配技巧的時候了,訣竅在于我們怎么去命名values文件夾和對設計稿上控件大小進行符合“規(guī)則”的單位換算华蜒。讓我們來看一下怎么去做舷蒲?
values文件夾根據(jù)限定符去命名
屏幕尺寸:指最短的可用屏幕區(qū)域。如sw480dp友多,表示適配可用屏幕尺寸起碼為480dp的情況牲平。
屏幕分辨率:必須較大數(shù)值在前,較小數(shù)值在后域滥,如1920x1080纵柿,表示適配分辨率為1920x1080的情況,其中x是英文字母x而不是乘號启绰。
屏幕像素密度:如mdpi昂儒,表示適配屏幕像素密度值近似或等于mdpi(160dpi)的情況。
屏幕方向:如land(橫向)委可、port(豎向)表示適配屏幕方向為land或者port的情況渊跋。
版本:vX(X代表版本號,現(xiàn)在是1到23)着倾,表示適配SDK版本為X的情況拾酝。
還有很多這里就不一一細說了。
限定符可以組合起來使用來限定更精確的情況如:values-mdpi-land-1920×1080-v19卡者,表示適配SDK版本為19蒿囤,分辨率為1920×1080的橫向屏幕的mdpi手機。
學過組合的都知道這里能有多少種限定符組合崇决,而且其中分辨率的值還是不定的材诽,只要有廠家生產(chǎn)不同分辨率的手機,我們就可以有無數(shù)種限定符組合恒傻,然而脸侥,我們并不用懼怕,限定符的適配是向下匹配的盈厘,譬如:有values-port-1920x1080的手機屏幕需要適配睁枕,當我們建立的values文件夾里面沒有一樣的時候,就適配到下一級扑庞,比如values-port-1280x720(如果有而且是最接近目標的話)譬重,如果還沒有拒逮,一直向下罐氨,最后起碼能適配到values這個沒有限定符的。
這里現(xiàn)在只考慮豎屏的時候(橫屏就是增加land限定符滩援,而且數(shù)值變化太大栅隐,布局也可能需要專門去寫,適配的原理還是一樣的,這里就以豎屏為例)根據(jù)以下的例子:
1.UI給我們做了一套1920x1080的圖片租悄,通常將該分辨率的圖片放在drawable-xxhdpi的文件夾下谨究,應為通常分辨率為1920x1080的屏幕都是xxhdpi(480dpi)的。
2.這時候泣棋,圖片上有一個90x30(px)的控件胶哲,在1920x1080的機子的布局里面根據(jù)換算方法轉(zhuǎn)換成30x10(dp)而xhdpi(320dpi)的1280x720上是多少呢?設在該屏幕上的長為A像素(px)潭辈,根據(jù)比例式鸯屿,A/720=30/1080,那么就知道A為20px把敢,那么根據(jù)換算公式寄摆,dp還是10!
3.我們再來看看兩個機子它們的sw是多少dp修赞?選短邊計算婶恼,1080/480/160=360,720/320/160=360柏副,那么結(jié)合第二點來看勾邦,只要sw相同,無論具體的在屏幕上顯示的px是多少割择,dp都是相同的检痰,dp相同,代表視覺大小是相同的锨推,意味著我們看到的布局效果是一樣的铅歼,適配解決!
所以我們只需要使用規(guī)則給values文件夾命名如下:values-swXXXdp换可,就可以了椎椰。大概像這樣:
可能有人有疑問了,那么如果遇上一些超級奇葩的廠家給機子設置了很奇葩的dpi值呢沾鳄,單靠這個規(guī)則就真的OK嗎慨飘?
譬如:遇上分辨率為1980x1080,但dpi是mdpi的屏幕時译荞,這臺機子的尺寸就是短邊1080/160/160=1080dp瓤的,那么我們只需要建立一個values-sw1080dp的文件夾,具體的dp值就是控件長的px值B = 30/1080*1080 = 30吞歼,dp = 30 / (160/160 )= 30圈膏,這并沒有什么問題。
其實可以看出來篙骡,這不是分辨率等比縮放的寫法嗎稽坤?只不過把等比縮放之后的分辨率再根據(jù)換算方法將px換成dp罷了丈甸。但是!分辨率可以有無窮多種尿褪,而以下是可以使用的通用屏幕尺寸的一些值:
1.320睦擂,針對以下屏幕配置的設備:
240x320ldpi(QVGA手持設備)
320x480mdpi(手持設備)
480x800hdpi(高分辨率手持設備)
2.480,針對480x800mdpi的屏幕(平板或手持設備)
3.600杖玲,針對600x1024mdip的屏幕(7英寸平板)
4.720顿仇,針對720x1280mdip的屏幕(10英寸平板)
注意:當應用程序提供了多個帶有不同值的最小寬度限定符資源目錄時,系統(tǒng)會使用最接近(不超出)設備最小寬度的那個資源摆马。這個限定符被添加在API級別13中夺欲。還要看android:requiresSmallestWidthDp屬性,它聲明了與你的應用程序兼容的最小的最小寬度今膊,并且smallestScreenWidthDp配置字段會持有這個設備最小寬度的值些阅。
那么我們的靈活性就大大提高的同時,相對于少則十幾多則數(shù)十的分辨率種類斑唬,會使用近似值的sw-XXXdp寫法就只需要少于十種的就可以搞定了市埋。
當然,按照前面說的限定符規(guī)則恕刘,在sw-XXXdp的基礎上缤谎,我們還可以加上版本號,屏幕方向去針對某些系統(tǒng)版本的手機或者平板褐着,同樣是比使用分辨率的少很多坷澡。
最后的問題就是就算要處理的只有幾個dimens文件,但每個里面可能有十分多的值含蓉,一個個換算频敛,新建,修改馅扣,簡直是折磨人的斟赚,但既然我們知道了換算的規(guī)則,知道了dimens的調(diào)用規(guī)則差油,寫個方法去修改xml的文件內(nèi)容是很簡單的拗军,代碼請下載(這里要感謝柯鏗!):Android屏幕適配