 Android屏幕適配
							時(shi)間:2018-09-27      來源:未知(zhi)
							Android屏幕適配
							時(shi)間:2018-09-27      來源:未知(zhi) 
							為什么需要屏幕適配
Android是(shi)一個開放的系統(tong),全球各種用戶、手機企業、OEM廠商(shang)都可以對Android系統(tong)進行(xing)定制(zhi),這就導致了Android系統(tong)的碎片(pian)化問(wen)題。其(qi)中(zhong)對于開發者來講工作(zuo)中(zhong)常碰到的就是(shi)屏幕(mu)碎片(pian)化,那(nei)么如(ru)何解(jie)決屏幕(mu)碎片(pian)化問(wen)題,實現優的屏幕(mu)適配,是(shi)每個Android開發者所要面臨的問(wen)題。
Android中的顯示單位
 
常見的定義
● 屏幕尺寸
屏(ping)(ping)幕尺(chi)寸(cun)指屏(ping)(ping)幕的對角(jiao)線的長度,單位是(shi)英寸(cun),1英寸(cun)=2.54厘(li)米
比如常見(jian)的屏(ping)幕尺寸(cun)有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等
● 屏幕分辨率
屏幕(mu)分辨率是指在橫縱向(xiang)上的(de)像素點數,單位是px,1px=1個像素點。一般以縱向(xiang)像素*橫向(xiang)像素,如1960*1080。
● 屏幕像素密度
屏(ping)幕(mu)像素(su)密(mi)度(du)是指(zhi)每英寸(cun)上的(de)像素(su)點數,單位是dpi,即“dot per inch”的(de)縮寫。屏(ping)幕(mu)像素(su)密(mi)度(du)與屏(ping)幕(mu)尺寸(cun)和屏(ping)幕(mu)分辨率有關,在單一變化條件下,屏(ping)幕(mu)尺寸(cun)越(yue)小、分辨率越(yue)高,像素(su)密(mi)度(du)越(yue)大,反(fan)之越(yue)小。
● dp、dip、dpi、sp、px
px:我們應該是(shi)比較熟悉的(de),前面的(de)分辨率就是(shi)用(yong)的(de)像(xiang)素為(wei)單位,大多數情(qing)況下,比如(ru)UI設計、Android原(yuan)生API都(dou)會以px作為(wei)統(tong)一的(de)計量單位,像(xiang)是(shi)獲(huo)取屏幕(mu)寬高等。
dip和dp:是一(yi)個意思(si),都是Density Independent Pixels的縮寫,即密(mi)度無關(guan)像素,上面我(wo)們(men)說過(guo),dpi是屏幕像素密(mi)度,假如一(yi)英(ying)寸里(li)面有160個像素,這個屏幕的像素密(mi)度就是160dpi,那么在這種(zhong)情況下,dp和px如何(he)換算呢?在Android中,規定以160dpi為基準,1dip=1px,如果(guo)密(mi)度是320dpi,則(ze)1dip=2px,以此類推(tui)。
sp:即scale-independent pixels,與dp類(lei)似,但是(shi)可以(yi)根據文字大小首(shou)選(xuan)項進(jin)行(xing)放縮,是(shi)設置字體大小的(de)御用單位。
● dip與px之間的換算公式
a. 2N + 2N/2 = PX
b.(2N-1)+ 2N/2 = PX
注(zhu):偶數(shu)值(zhi)dip 的(de)(de)1.5倍等于相對應的(de)(de)px值(zhi),偶數(shu)值(zhi)的(de)(de)間(jian)距與奇(qi)數(shu)元素(su)設置(zhi)居中對齊的(de)(de)時候(hou)會有1px的(de)(de)誤差。
  
屏幕適配方案
1.充(chong)分利用”wrap_content” 、”match_parent”以及“weight”
通常(chang)我們會在布局(ju)視(shi)(shi)圖中(zhong)使(shi)用(yong)”wrap_content”和(he)(he)”match_parent”來確定(ding)它的寬(kuan)和(he)(he)高。如(ru)(ru)果(guo)你使(shi)用(yong)了(le)”wrap_content”,相應視(shi)(shi)圖的寬(kuan)和(he)(he)高就(jiu)會被設定(ding)成剛好能夠包含視(shi)(shi)圖中(zhong)內容的小(xiao)值。而(er)如(ru)(ru)果(guo)你使(shi)用(yong)了(le)”match_parent”,就(jiu)會讓視(shi)(shi)圖的寬(kuan)和(he)(he)高延(yan)伸至充滿整個父布局(ju)。
2.多使(shi)用(yong)相對布(bu)局(ju)RelativeLayout,少(shao)使(shi)用(yong)絕(jue)對布(bu)局(ju)
如果(guo)你(ni)需(xu)要讓(rang)子(zi)視(shi)圖(tu)能夠有更多的排列方式,而不是(shi)簡單地(di)排成一行(xing)或一列,使用(yong)RelativeLayout將會是(shi)更好的解決方案(an)。RelativeLayout允許布局的子(zi)控件之間使用(yong)相對(dui)定(ding)位的方式控制(zhi)控件的位置,比如你(ni)可以讓(rang)一個子(zi)視(shi)圖(tu)居屏幕(mu)左(zuo)側對(dui)齊(qi),讓(rang)另一個子(zi)視(shi)圖(tu)居屏幕(mu)右側對(dui)齊(qi)。
3.使用.9圖(tu)
“點九”是andriod平臺的應用(yong)軟(ruan)件(jian)開發里的一種特(te)殊的圖片形式,文件(jian)擴(kuo)展名為:.9.png
智能(neng)手機中有(you)自動橫屏的(de)(de)(de)功能(neng),同一(yi)幅界(jie)面會(hui)在隨著手機(或平板電腦)中的(de)(de)(de)方(fang)向(xiang)傳感器的(de)(de)(de)參數不同而(er)改變顯示的(de)(de)(de)方(fang)向(xiang),在界(jie)面改變方(fang)向(xiang)后,界(jie)面上的(de)(de)(de)圖(tu)形會(hui)因為長寬的(de)(de)(de)變化而(er)產生拉(la)伸,造成圖(tu)形的(de)(de)(de)失(shi)真變形。
我們都知道android平臺(tai)有多(duo)(duo)種不同(tong)的分辨(bian)(bian)率,很多(duo)(duo)控件(jian)的切(qie)圖文件(jian)在被放大拉伸后,邊角會模糊失真。OK,在android平臺(tai)下(xia)使用點(dian)九PNG技術,可以(yi)將(jiang)圖片橫向和縱向同(tong)時(shi)進(jin)行拉伸,以(yi)實現在多(duo)(duo)分辨(bian)(bian)率下(xia)的完美顯示效果。
4.支持各種屏幕(mu)密度
使(shi)用非密度制約像素
由于各種(zhong)屏幕的(de)(de)像素(su)密度(du)(du)都(dou)有(you)所不(bu)同(tong)(tong)(tong),因(yin)此相(xiang)同(tong)(tong)(tong)數(shu)量的(de)(de)像素(su)在不(bu)同(tong)(tong)(tong)設備(bei)上的(de)(de)實(shi)際大(da)(da)小也有(you)所差異(yi),這樣使(shi)用像素(su)定(ding)義布局尺(chi)寸(cun)(cun)就(jiu)會產生(sheng)問題。因(yin)此,請務必使(shi)用 dp 或 sp 單(dan)位指定(ding)尺(chi)寸(cun)(cun)。dp 是(shi)一(yi)(yi)種(zhong)非(fei)密度(du)(du)制約(yue)像素(su),其尺(chi)寸(cun)(cun)與 160 dpi 像素(su)的(de)(de)實(shi)際尺(chi)寸(cun)(cun)相(xiang)同(tong)(tong)(tong)。sp 也是(shi)一(yi)(yi)種(zhong)基本單(dan)位,但它可根(gen)據用戶(hu)的(de)(de)偏好文字大(da)(da)小進行(xing)調整(即(ji)尺(chi)度(du)(du)獨立性像素(su)),因(yin)此我(wo)們應將該(gai)測量單(dan)位用于定(ding)義文字大(da)(da)小。
5.提(ti)供備用(yong)位(wei)圖
由于(yu) Android 可在(zai)具有(you)各種屏幕(mu)密度的(de)設備上(shang)運(yun)行,因(yin)此我們提供的(de)位圖(tu)資(zi)源應始終可以(yi)滿足各類普(pu)遍密度范(fan)圍的(de)要(yao)求:低(di)密度、中等密度、高密度以(yi)及超高密度。這將有(you)助(zhu)于(yu)我們的(de)圖(tu)片在(zai)所有(you)屏幕(mu)密度上(shang)都能得(de)到出色的(de)質量和效果。
要生(sheng)成(cheng)這些圖(tu)片,我(wo)們應先提取矢量格(ge)式(shi)的(de)原(yuan)始資源,然后根據以下尺(chi)寸范圍針對各密(mi)度(du)生(sheng)成(cheng)相應的(de)圖(tu)片。
xhdpi:2.0
hdpi:1.5
mdpi:1.0
ldpi:0.75
也就是說,如果我們為 xhdpi 設(she)(she)備(bei)生成了 200x200 px尺(chi)寸的圖(tu)片,就應該使用同一資源為 hdpi、mdpi 和(he)(he) ldpi 設(she)(she)備(bei)分別生成 150x150、100x100 和(he)(he) 75x75 尺(chi)寸的圖(tu)片。
然(ran)后,將生成的(de)(de)圖(tu)(tu)片文(wen)件放在 res/ 下(xia)的(de)(de)相應(ying)子目錄中(mdpi、hdpi、xhdpi、xxhdpi),系(xi)統就會根據運行您應(ying)用的(de)(de)設備(bei)的(de)(de)屏幕密(mi)度自動選擇合適的(de)(de)圖(tu)(tu)片。
這樣一來(lai),只要我(wo)們引用(yong) @drawable/id,系(xi)統都能根據(ju)相應屏幕的 dpi 選取合適的位(wei)圖。
但是還有個(ge)問題需要注意下,如果是.9圖或者是不需要多(duo)個(ge)分辨率(lv)的(de)圖片(pian)(pian),就放在(zai)drawable文(wen)(wen)件夾即可,對(dui)應分辨率(lv)的(de)圖片(pian)(pian)要正確的(de)放在(zai)合(he)適的(de)文(wen)(wen)件夾,否則會造成圖片(pian)(pian)拉伸等(deng)問題。

