前言
本文為自身的總結(jié)與結(jié)合其他文章引用而成忽媒,分別為:
wangwangli6:Android開發(fā):最全面、最易懂的Android屏幕適配解決方案
jiashuai94:安卓屏幕完美適配方案——獨(dú)家秘笈
宇寶守護(hù)神:ImageView的scaleType的屬性理解
秦子帥:Android劉海屏適配方案
(暫未總結(jié)劉海屏適配,如有需要請查看這篇文章)自身的思考&實(shí)踐
一初狰、為什么要適配
由于Android系統(tǒng)的開放性莫杈,任何用戶、開發(fā)者奢入、硬件廠商筝闹、運(yùn)營商都可以對Android系統(tǒng)和硬件進(jìn)行定制,修改成他們想要的樣子腥光。
那么這種“碎片化”到達(dá)什么程度呢关顷?
以上每一個矩形都代表一種機(jī)型,且它們屏幕尺寸武福、屏幕分辨率大相徑庭议双。隨著Android設(shè)備的增多,設(shè)備碎片化捉片、系統(tǒng)碎片化平痰、屏幕尺寸碎片化、屏幕碎片化的程度也在不斷加深界睁。
備注:
- Android系統(tǒng)碎片化:基于Google原生系統(tǒng)觉增,小米定制的MIUI、魅族定制的flyme翻斟、華為定制的EMUI等等逾礁;
- Android機(jī)型屏幕尺寸碎片化:5寸、5.5寸访惜、6寸等等嘹履;
- Android屏幕分辨率碎片化:320x480、480x800债热、720x1280砾嫉、1080x1920等;
當(dāng)Android系統(tǒng)窒篱、屏幕尺寸焕刮、屏幕密度出現(xiàn)碎片化的時候舶沿,就很容易出現(xiàn)同一元素在不同手機(jī)上顯示不同的問題。試想一下這么一個場景:
為4.3寸屏幕準(zhǔn)備的UI設(shè)計圖配并,運(yùn)行在5.0寸的屏幕上括荡,很可能在右側(cè)和下側(cè)存在大量的空白;而5.0寸的UI設(shè)計圖運(yùn)行到4.3寸的設(shè)備上溉旋,很可能顯示不下畸冲。
為了保證用戶獲得一致的用戶體驗效果,使得某一元素在Android不同尺寸、不同分辨率的观腊、不同系統(tǒng)的手機(jī)上具備相同的顯示效果邑闲,能夠保持界面上的效果一致,我們需要對各種手機(jī)屏幕進(jìn)行適配!
二梧油、基本概念
1苫耸、像素(px):
- 含義:通常所說的像素,就是CCD/CMOS上光電感應(yīng)元件的數(shù)量婶溯,一個感光元件經(jīng)過感光鲸阔,光電信號轉(zhuǎn)換偷霉,A/D轉(zhuǎn)換等步驟以后迄委,在輸出的照片上就形成一個點(diǎn),我們?nèi)绻延跋穹糯髷?shù)倍类少,會發(fā)現(xiàn)這些連續(xù)色調(diào)其實(shí)是由許多色彩相近的小方點(diǎn)所組成叙身,這些小方點(diǎn)就是構(gòu)成影像的最小單位“像素”(Pixel)。簡而言之硫狞,像素就是手機(jī)屏幕的最小構(gòu)成單元信轿。
- 單位:px(pixel),1px = 1像素點(diǎn)
一般情況下UI設(shè)計師的設(shè)計圖會以px作為統(tǒng)一的計量單位残吩。
2财忽、分辨率:
- 含義:手機(jī)在橫向、縱向上的像素點(diǎn)數(shù)總和
一般描述成 寬*高 泣侮,即橫向像素點(diǎn)個數(shù) * 縱向像素點(diǎn)個數(shù)(如1080 x 1920)即彪。 - 單位:px(pixel),1px = 1像素點(diǎn)
3活尊、屏幕尺寸(in):
- 含義:手機(jī)對角線的物理尺寸
- 單位 英寸(inch)隶校,一英寸大約2.54cm
常見的尺寸有4.7寸、5寸蛹锰、5.5寸深胳、6寸
4、屏幕像素密度(dpi):
- 含義:每英寸的像素點(diǎn)數(shù)铜犬。
例如每英寸內(nèi)有160個像素點(diǎn)舞终,則其像素密度為160dpi轻庆。 - 單位:dpi(dots per inch)
- 計算公式: 像素密度 = 像素 / 尺寸 (dpi = px / in)
- 標(biāo)準(zhǔn)屏幕像素密度(mdpi): 每英寸長度上還有160個像素點(diǎn)(160dpi),即稱為標(biāo)準(zhǔn)屏幕像素密度(mdpi)敛劝。
密度類型 | 代表的分辨率(px) | 屏幕像素密度(dpi) |
---|---|---|
低密度(ldpi) | 240 x 320 | 120 |
中密度(mdpi) | 320 x 480 | 160 |
高密度(hdpi) | 480 x 800 | 240 |
超高密度(xhdpi) | 720 x 1280 | 320 |
超超高密度(xxhdpi) | 1080 x 1920 | 480 |
屏幕尺寸榨了、分辨率、像素密度三者關(guān)系
一部手機(jī)的分辨率是寬x高攘蔽,屏幕大小是以寸為單位龙屉,那么三者的關(guān)系是:
假設(shè)一部手機(jī)的分辨率是1080x1920(px),屏幕大小是5寸
5满俗、密度無關(guān)像素(dp):
- 含義:density-independent pixel转捕,叫dp或dip,與終端上的實(shí)際物理像素點(diǎn)無關(guān)
- 單位:dp唆垃,可以保證在不同屏幕像素密度的設(shè)備上顯示相同的效果五芝,是安卓特有的長度單位。
- 場景例子:假如同樣都是畫一條長度是屏幕一半的線辕万,如果使用px作為計量單位枢步,那么在480x800分辨率手機(jī)上設(shè)置應(yīng)為240px;在320x480的手機(jī)上應(yīng)設(shè)置為160px渐尿,二者設(shè)置就不同了醉途;如果使用dp為單位,在這兩種分辨率下砖茸,160dp都顯示為屏幕一半的長度隘擎。
- dp與px的轉(zhuǎn)換:1dp = (dpi / 160 ) * 1px;
密度類型 | 代表的分辨率(px) | 屏幕密度(dpi) | 換算 |
---|---|---|---|
低密度(ldpi) | 240 x 320 | 120 | 1dp = 0.75px |
中密度(mdpi) | 320 x 480 | 160 | 1dp=1px |
高密度(hdpi) | 480 x 800 | 240 | 1dp=1.5px |
超高密度(xhdpi) | 720 x 1280 | 320 | 1dp=2px |
超超高密度(xxhdpi) | 1080 x 1920 | 480 | 1dp=3px |
6、獨(dú)立比例像素(sp):
- 含義:scale-independent pixel凉夯,叫sp或sip
- 單位:sp货葬,字體大小專用單位
Android開發(fā)時用此單位設(shè)置文字大小,可根據(jù)字體大小首選項進(jìn)行縮放劲够;
推薦使用12sp震桶、14sp、18sp征绎、22sp作為字體大小蹲姐,不推薦使用奇數(shù)和小數(shù),容易造成精度丟失炒瘸,12sp以下字體太小淤堵。
7、sp 與 dp 的區(qū)別:
- dp只跟屏幕的像素密度有關(guān)顷扩;
- sp和dp很類似但唯一的區(qū)別是拐邪,Android系統(tǒng)允許用戶自定義文字尺寸大小(小隘截、正常扎阶、大汹胃、超大等等),當(dāng)文字尺寸是“正扯危”時1sp=1dp=0.00625英寸着饥,而當(dāng)文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸惰赋。類似我們在windows里調(diào)整字體尺寸以后的效果——窗口大小不變宰掉,只有文字大小改變。
追到android源碼赁濒,發(fā)現(xiàn)系統(tǒng)內(nèi)部用applyDimension()
(路徑:android.util.TypedValue.applyDimension())將所有單位都轉(zhuǎn)換成px 再處理:
/**
* Converts an unpacked complex data value holding a dimension to its final floating
* point value. The two parameters <var>unit</var> and <var>value</var>
* are as in {@link #TYPE_DIMENSION}.
*
* @param unit The unit to convert from.
* @param value The value to apply the unit to.
* @param metrics Current display metrics to use in the conversion --
* supplies display density and scaling information.
*
* @return The complex floating point value multiplied by the appropriate
* metrics depending on its unit.
*/
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
可以發(fā)現(xiàn)dp和sp的區(qū)別在于density和scaledDensity兩個值上轨奄;
/**
* The logical density of the display. This is a scaling factor for the
* Density Independent Pixel unit, where one DIP is one pixel on an
* approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen),
* providing the baseline of the system's display. Thus on a 160dpi screen
* this density value will be 1; on a 120 dpi screen it would be .75; etc.
*
* <p>This value does not exactly follow the real screen size (as given by
* {@link #xdpi} and {@link #ydpi}, but rather is used to scale the size of
* the overall UI in steps based on gross changes in the display dpi. For
* example, a 240x320 screen will have a density of 1 even if its width is
* 1.8", 1.3", etc. However, if the screen resolution is increased to
* 320x480 but the screen size remained 1.5"x2" then the density would be
* increased (probably to 1.5).
*
* @see #DENSITY_DEFAULT
*/
public float density;
/**
* A scaling factor for fonts displayed on the display. This is the same
* as {@link #density}, except that it may be adjusted in smaller
* increments at runtime based on a user preference for the font size.
*/
public float scaledDensity;
三、適配方案
屏幕適配問題的本質(zhì)是使得布局拒炎、布局組件在Android不同尺寸挪拟、不同分辨率的手機(jī)上具備相同的顯示效果,下面我將分幾個方面來談?wù)勅绾稳ミm配击你。
3.1 關(guān)于布局組件的適配:
-
3.1.1 使用密度無關(guān)像素指定尺寸
由于各種屏幕的像素密度都有所不同玉组,因此相同數(shù)量的像素在不同設(shè)備上的實(shí)際大小也會有所差異,這樣使用像素(px)定義布局尺寸就會產(chǎn)生問題丁侄。
因此惯雳,請務(wù)必使用密度無關(guān)像素 dp 或獨(dú)立比例像素 sp 單位指定尺寸。
備注:在生產(chǎn)過程中绒障,廠家不會完全按照屏幕密度標(biāo)準(zhǔn)去生產(chǎn)Android設(shè)備吨凑,會在Google的標(biāo)準(zhǔn)周圍浮動變化,或是偏離Google的屏幕密度標(biāo)準(zhǔn)比較大户辱,再加上理論計算(開方)造成的誤差,實(shí)際上使用dp作為單位是不能完完全全的完成適配操作糙臼;
3.1.2 使用相對布局或線性布局庐镐,不要使用絕對布局
對于線性布局(Linearlayout)、相對布局(RelativeLayout)变逃、幀布局(FrameLayout)必逆、絕對布局(AbsoluteLayout)以及新增的加強(qiáng)版幀布局(CoordinatorLayout)需要根據(jù)需求進(jìn)行選擇,沒有絕對而言揽乱。
但因為RelativeLayout講究的是相對位置名眉,即使屏幕的大小改變,視圖之前的相對位置都不會變化凰棉,與屏幕大小無關(guān)损拢,靈活性很強(qiáng),而LinearLayout法準(zhǔn)確地控制子視圖之間的位置關(guān)系撒犀,只能簡單的一個挨著一個地排列福压,所以掏秩,對于屏幕適配來說,使用相對布局(RelativeLayout)將會是更好的解決方案荆姆,至于絕對布局由于適配性極差蒙幻,所以極少使用。3.1.3 使用wrap_content胆筒、match_parent邮破、權(quán)重
使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬編碼的尺寸,系統(tǒng)會自動計算相應(yīng)的數(shù)值仆救,視圖就會相應(yīng)地使用自身所需的空間或填滿可用空間决乎,讓布局正確適應(yīng)各種屏幕尺寸和屏幕方向,組件的權(quán)重比同理派桩。3.1.4 使用minWidth构诚、minHeight、lines等屬性
很多時候我們顯示的數(shù)據(jù)都是由后臺返回的铆惑,再由我們加工處理后去適配我們的組件范嘱,這些數(shù)據(jù)的長度我們是無法確定的,而正常情況下我們構(gòu)思的布局都僅是適用于理想的情況下员魏,為了保證界面的對齊丑蛤、數(shù)據(jù)顯示完整等等的原因,我們需要在構(gòu)思布局時增加對組件最小寬高度撕阎、行數(shù)等屬性的設(shè)置受裹,確保在特殊的數(shù)據(jù)下不會破壞我們的整體布局。3.1.5 dimens使用
組件的長寬我們可以通過dimens來定義虏束,不同的屏幕尺寸可以定義不同的數(shù)值棉饶,或者是不同的語言顯示我們也可以定義不同的數(shù)值,因為翻譯后的長度一般都不會跟中文的一致镇匀。
3.2 關(guān)于布局的適配:
以上幾種方式可以解決屏幕適配性的問題照藻,但是那些通過伸縮控件來適應(yīng)各種不同屏幕大小的布局,未必就是提供了最好的用戶體驗汗侵。你的應(yīng)用程序應(yīng)該不僅僅實(shí)現(xiàn)了可自適應(yīng)的布局幸缕,還應(yīng)該提供一些方案根據(jù)屏幕的配置來加載不同的布局,可以通過配置限定符(configuration qualifiers)來實(shí)現(xiàn)晰韵。配置限定符允許程序在運(yùn)行時根據(jù)當(dāng)前設(shè)備的配置自動加載合適的資源(比如為不同尺寸屏幕設(shè)計不同的布局)发乔。
-
3.2.1 使用Size限定符
很多應(yīng)用會在較大的屏幕上實(shí)施“雙面板”模式,即在一個面板上顯示項目列表雪猪,而在另一面板上顯示對應(yīng)內(nèi)容栏尚。平板電腦和電視的屏幕已經(jīng)大到可以同時容納這兩個面板了,但手機(jī)屏幕就需要分別顯示浪蹂。因此抵栈,我們可以使用以下文件以便實(shí)施這些布局:
請注意第二種布局名稱目錄中的 large 限定符告材。系統(tǒng)會在屬于較大屏幕(例如 7 英寸或更大的平板電腦)的設(shè)備上選擇此布局。系統(tǒng)會在較小的屏幕上選擇其他布局(無限定符)古劲。
-
3.2.2 最小寬度限定符
使用Size限定符有一個問題會讓很多程序員感到頭疼斥赋,large到底是指多大呢?很多應(yīng)用程序都希望能夠更自由地為不同屏幕設(shè)備加載不同的布局产艾,不管它們是不是被系統(tǒng)認(rèn)定為”large”疤剑。這就是Android為什么在3.2以后引入了”Smallest-width”限定符。
最小寬度限定符可讓您通過指定某個最小寬度(以 dp 為單位)來定位屏幕闷堡。例如隘膘,標(biāo)準(zhǔn) 7 英寸平板電腦的最小寬度為 600 dp,因此如果您要在此類屏幕上的用戶界面中使用雙面板(但在較小的屏幕上只顯示列表)杠览,您可以使用上文中所述的單面板和雙面板這兩種布局弯菊,但您應(yīng)使用 sw600dp 指明雙面板布局僅適用于最小寬度為 600 dp 的屏幕,而不是使用 large 尺寸限定符踱阿。
也就是說管钳,對于最小寬度大于等于 600 dp 的設(shè)備,系統(tǒng)會選擇 layout-sw600dp/main.xml(雙面板)布局软舌,否則系統(tǒng)就會選擇 layout/main.xml(單面板)布局才漆。
但 Android 版本低于 3.2 的設(shè)備不支持此技術(shù),原因是這些設(shè)備無法將 sw600dp 識別為尺寸限定符佛点,因此我們?nèi)孕枋褂?large 限定符醇滥。這樣一來,就會有一個名稱為 res/layout-large/main.xml 的文件(與 res/layout-sw600dp/main.xml 一樣)超营。但是沒有太大關(guān)系鸳玩,我們將馬上學(xué)習(xí)如何避免此類布局文件出現(xiàn)的重復(fù)。
-
3.2.3 使用布局別名
最小寬度限定符僅適用于 Android 3.2 及更高版本糟描。因此怀喉,如果我們?nèi)孕枋褂门c較低版本兼容的概括尺寸范圍(小、正常船响、大和特大)。例如躲履,如果要將用戶界面設(shè)計成在手機(jī)上顯示單面板见间,但在 7 英寸平板電腦、電視和其他較大的設(shè)備上顯示多面板工猜,那么我們就需要提供以下文件:res/layout/main.xml: 單面板布局
res/layout-large: 多面板布局
res/layout-sw600dp: 多面板布局
后兩個文件是相同的米诉,因為其中一個用于和 Android 3.2 設(shè)備匹配,而另一個則是為使用較低版本 Android 的平板電腦和電視準(zhǔn)備的篷帅。
要避免平板電腦和電視的文件出現(xiàn)重復(fù)(以及由此帶來的維護(hù)問題)史侣,您可以使用別名文件拴泌。例如,您可以定義以下布局:
res/layout/main.xml惊橱,單面板布局
res/layout/main_twopanes.xml蚪腐,雙面板布局
然后添加這兩個文件:
res/values-large/layout.xml:
res/values-sw600dp/layout.xml:
后兩個文件的內(nèi)容相同,但它們并未實(shí)際定義布局税朴。它們只是將 main 設(shè)置成了 main_twopanes 的別名回季。由于這些文件包含 large 和 sw600dp 選擇器,因此無論 Android 版本如何正林,系統(tǒng)都會將這些文件應(yīng)用到平板電腦和電視上(版本低于 3.2 的平板電腦和電視會匹配 large泡一,版本高于 3.2 的平板電腦和電視則會匹配 sw600dp)。
-
3.2.4 使用屏幕方向限定符
某些布局會同時支持橫向模式和縱向模式觅廓,但我們可以通過調(diào)整優(yōu)化其中大部分布局的效果鼻忠。在新聞閱讀器示例應(yīng)用中,每種屏幕尺寸和屏幕方向下的布局行為方式如下所示:小屏幕杈绸,縱向:單面板帖蔓,帶徽標(biāo)
小屏幕,橫向:單面板蝇棉,帶徽標(biāo)
7 英寸平板電腦讨阻,縱向:單面板,帶操作欄
7 英寸平板電腦篡殷,橫向:雙面板钝吮,寬厘贼,帶操作欄
10 英寸平板電腦漆羔,縱向:雙面板,窄验靡,帶操作欄
10 英寸平板電腦劲弦,橫向:雙面板耳标,寬,帶操作欄
電視邑跪,橫向:雙面板次坡,寬,帶操作欄因此画畅,這些布局中的每一種都定義在了 res/layout/ 目錄下的某個 XML 文件中砸琅。為了繼續(xù)將每個布局分配給各種屏幕配置,該應(yīng)用會使用布局別名將兩者相匹配:
res/layout/onepane.xml:(單面板)
res/layout/onepane_with_bar.xml:(單面板帶操作欄)
res/layout/twopanes.xml:(雙面板轴踱,寬布局)
res/layout/twopanes_narrow.xml:(雙面板症脂,窄布局)
既然我們已定義了所有可能的布局,那就只需使用配置限定符將正確的布局映射到各種配置即可。
現(xiàn)在只需使用布局別名技術(shù)即可做到這一點(diǎn):
res/values/layouts.xml:
res/values-sw600dp-land/layouts.xml:
res/values-sw600dp-port/layouts.xml:
res/values-large-land/layouts.xml:
res/values-large-port/layouts.xml:
-
3.2.5 多套layout適配
res/values/layouts.xml:
res/values-sw600dp-land/layouts.xml:
res/values-sw600dp-port/layouts.xml:
res/values-large-land/layouts.xml:
res/values-large-port/layouts.xml:
3.3 關(guān)于圖片的適配:
-
3.3.1 LOGO 圖標(biāo)
建議按官方標(biāo)準(zhǔn)準(zhǔn)備好各個圖標(biāo)诱篷;
屏幕密度 | 對應(yīng)的圖片大小 | 圖片資源目錄 |
---|---|---|
120dip | 36px * 36px | mipmap-ldpi |
160dip(基準(zhǔn)) | 48px * 48px | mipmap或者mipmap-mdpi |
240dip(1.5倍) | 72px * 72px | mipmap-hdpi |
320dip (2倍) | 96px * 96px | mipmap-xhdpi |
480dip (3倍) | 144px * 144px | mipmap-xxhdpi |
640dip (4倍) | 192px * 192px | mipmap-xxxhdpi |
3.3.2 普通圖片和圖標(biāo)
建議安裝官方的密度類型進(jìn)行切圖即可壶唤,但一般我們只需xxhdpi或xxxhdpi的切圖即可滿足我們的需求;3.3.3 自動拉伸位圖:Nine-Patch的圖片類型
支持不同屏幕大小通常情況下也意味著棕所,你的圖片資源也需要有自適應(yīng)的能力闸盔。例如,一個按鈕的背景圖片必須能夠隨著按鈕大小的改變而改變橙凳。
如果你想使用普通的圖片來實(shí)現(xiàn)上述功能蕾殴,你會發(fā)現(xiàn)這是難以實(shí)現(xiàn)的,因為運(yùn)行時會均勻地拉伸或壓縮你的圖片岛啸。解決方案是使用nine-patch圖片钓觉,它是一種被特殊處理過的PNG圖片,你可以指定哪些區(qū)域可以拉伸而哪些區(qū)域不可以坚踩。3.3.4 動畫荡灾、自定義view、shape
可以使用代碼進(jìn)行控制和展示多種視圖瞬铸,如patch動畫替代幀動畫批幌。3.3.5 ImageView的ScaleType適配
- android:scaleType=“center”
保持原圖的大小,顯示在ImageView的中心嗓节。當(dāng)原圖的size大于ImageView的size時荧缘,多出來的部分被截掉。 - android:scaleType=“center_inside”
以原圖正常顯示為目的拦宣,如果原圖大小大于ImageView的size截粗,就按照比例縮小原圖的寬高,居中顯示在ImageView中鸵隧。如果原圖size小于ImageView的size绸罗,則不做處理居中顯示圖片。 - android:scaleType=“center_crop”
以原圖填滿ImageView為目的豆瘫,如果原圖size大于ImageView的size珊蟀,則與center_inside一樣,按比例縮小外驱,居中顯示在ImageView上育灸。如果原圖size小于ImageView的size,則按比例拉升原圖的寬和高昵宇,填充ImageView居中顯示描扯。 - android:scaleType=“matrix”
不改變原圖的大小,從ImageView的左上角開始繪制趟薄,超出部分做剪切處理。 - androd:scaleType=“fit_xy”
把圖片按照指定的大小在ImageView中顯示典徊,拉伸顯示圖片杭煎,不保持原比例恩够,填滿ImageView. - android:scaleType=“fit_start”
把原圖按照比例放大縮小到ImageView的高度,顯示在ImageView的start(前部/上部)羡铲。 - android:sacleType=“fit_center”
把原圖按照比例放大縮小到ImageView的高度蜂桶,顯示在ImageView的center(中部/居中顯示)。 -
android:scaleType=“fit_end”
把原圖按照比例放大縮小到ImageView的高度也切,顯示在ImageVIew的end(后部/尾部/底部)
3.4 關(guān)于代碼適配:
在代碼中使用Google提供的API對設(shè)備的屏幕寬度進(jìn)行測量扑媚,然后按照需求進(jìn)行設(shè)置。
對于當(dāng)前控件的寬高設(shè)置雷恃,需要做的操作是首先要獲取到該控件的父控件疆股,使用父控件對當(dāng)前控件的寬高進(jìn)行設(shè)置操作!
DisplayMetrics metrics = new DisplayMetrics ();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
手機(jī)對應(yīng)的寬高:
Constants.screenHeight= metrics.heightDixels;
Constants.screenWidth= metrics.widthDixels;
RelativeLayout.LayoutParams=new RelativeLayout.LayoutParams();
(int)( Constants.screenHeight*0.5+0.5f);
(int)( Constants.screenWidth *0.5+0.5f);
在上面的兩個計算操作中最后加上0.5f的作用是:進(jìn)行float強(qiáng)轉(zhuǎn)到int類型的時候會出現(xiàn)都是精度的問題倒槐。當(dāng)使用Java代碼進(jìn)行寬高設(shè)置的時候旬痹,假如出現(xiàn)320.2dp這樣的數(shù)據(jù)此時直接進(jìn)行int得到的值是320;但是假如出現(xiàn)320.7這樣的數(shù)據(jù)的時候讨越,由于int的計算規(guī)則两残,會直接強(qiáng)轉(zhuǎn)為320,但是從實(shí)際出發(fā)把跨,這個時候的值取321更為合適人弓。
所以在計算的最后直接加0.5,這樣一來着逐,320.2+0.5=320.7崔赌,進(jìn)行數(shù)據(jù)的強(qiáng)轉(zhuǎn)操作得到的數(shù)據(jù)是320,320.7+0.5=321.2滨嘱,進(jìn)行數(shù)據(jù)強(qiáng)轉(zhuǎn)操作得到的數(shù)據(jù)是321峰鄙,這樣一來得到的數(shù)據(jù)就和實(shí)際預(yù)想的更為接近!太雨!
3.5 關(guān)于接口配合:
本地加載圖片前判斷手機(jī)分辨率或像素密度吟榴,向服務(wù)器請求對應(yīng)級別圖片。
總結(jié)
經(jīng)過上面的介紹囊扳,相信大家對于屏幕的適配都有了一定的了解吩翻,但實(shí)際上我們并不會完全去執(zhí)行上面的全部操作,而是需要根據(jù)我們的項目需求去選擇最合適的方法去適配锥咸。例如說你的產(chǎn)品是針對老年人的狭瞎,你的字體單位是使用sp還是dp呢?又比如說RelativeLayout和權(quán)重能較好的解決適配的問題搏予,但實(shí)際上它們消耗更多的性能熊锭,如何去衡量性能與適配的度呢?
知識是死的,人是活的碗殷,能靈活運(yùn)用相關(guān)知識方顯真本事精绎。