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