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

為什么要適配,適配的好處等等這里就不說了带到,直接說我們要怎么適配昧碉,請看下面的內(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返弹。換算方法代碼:

px與dp的相互換算

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换可,就可以了椎椰。大概像這樣:


values文件夾命名

可能有人有疑問了,那么如果遇上一些超級奇葩的廠家給機子設置了很奇葩的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屏幕適配

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓄喇,一起剝皮案震驚了整個濱河市发侵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妆偏,老刑警劉巖刃鳄,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異楼眷,居然都是意外死亡铲汪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門罐柳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掌腰,“玉大人,你說我怎么就攤上這事张吉〕萘海” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵肮蛹,是天一觀的道長勺择。 經(jīng)常有香客問我,道長伦忠,這世上最難降的妖魔是什么省核? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮昆码,結(jié)果婚禮上气忠,老公的妹妹穿的比我還像新娘。我一直安慰自己赋咽,他們只是感情好旧噪,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脓匿,像睡著了一般淘钟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陪毡,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天米母,我揣著相機與錄音,去河邊找鬼毡琉。 笑死爱咬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的绊起。 我是一名探鬼主播精拟,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虱歪!你這毒婦竟也來了蜂绎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤笋鄙,失蹤者是張志新(化名)和其女友劉穎师枣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萧落,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡践美,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年洗贰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陨倡。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡敛滋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兴革,到底是詐尸還是另有隱情绎晃,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布杂曲,位于F島的核電站庶艾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏擎勘。R本人自食惡果不足惜咱揍,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棚饵。 院中可真熱鬧述召,春花似錦、人聲如沸蟹地。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怪与。三九已至夺刑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分别,已是汗流浹背遍愿。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耘斩,地道東北人沼填。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像括授,于是被迫代替她去往敵國和親坞笙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容