android屏幕自適應(yīng)研究-創(chuàng)新互聯(lián)

 最近公司做的項(xiàng)目中涉及到屏幕自適應(yīng)的問(wèn)題。由于做的是電視版的項(xiàng)目,因此屏幕自適應(yīng)問(wèn)題更為突出。想起之前曾經(jīng)寫過(guò)一篇這樣的文章作為備忘。今天特意在電腦上翻了一下,把它找了出來(lái),順便也把當(dāng)時(shí)參考過(guò)的文章給找了出來(lái)。這里分享給大家,希望對(duì)大家有所幫助,有錯(cuò)誤的地方還忘各位指正。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括高港網(wǎng)站建設(shè)、高港網(wǎng)站制作、高港網(wǎng)頁(yè)制作以及高港網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,高港網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到高港省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

  參考的文章地址如下,在此對(duì)兩位作者表示感謝。

http://blog.csdn.net/beihai1212/article/details/7026327

http://blog.csdn.net/moruite/article/details/6028547

    首先我們了解一下屏幕分辨率,像素密度,drawable和layout的匹配規(guī)則等問(wèn)題,然后會(huì)給出屏幕自適應(yīng)的解決方案(官方文檔上也有)。

1、基本概念

in:即英寸,它表示的是屏幕的物理尺寸。1in = 2.54cm,而且我們平時(shí)所說(shuō)的尺寸是指可視屏幕的對(duì)角線的長(zhǎng)度,并不是屏幕面積。因此,比如我們說(shuō)一個(gè)手機(jī)是3.2英尺,也就 是說(shuō),它的可視區(qū)域的對(duì)角線的長(zhǎng)度是:3.2*2.54 = 8.128cm。

分辨率:它指的是屏幕垂直方向和水平方向的像素個(gè)數(shù)。比如分辨率是:480*320,也就是說(shuō): 水平方向(寬)有320個(gè)像素點(diǎn)。豎直方向(高)有480個(gè)像素點(diǎn)。

dpi:像素密度,即dots per inch,指的是每英寸的像素?cái)?shù)。如160dpi指手機(jī)水平或垂直方向 上每英寸距離有160個(gè)像素點(diǎn)。假定設(shè)備分辨率為320*240,屏幕長(zhǎng)2英寸寬1.5英 寸,dpi=320/2=240/1.5=160。Android中主要有三種像素密度:120,160,240。它就是 DisplayMetrics類中屬性densityDpi的值。

density:密度,指每平方英寸中的像素?cái)?shù)。計(jì)算方式:density=分辨率/屏幕尺寸。在android中,160dpi的密度為1.0,120dpi的密度為0.75,240dpi的密度為1.5。它就是 DisplayMetrics類中屬性density的值。

px:即pixel,像素。它在不同設(shè)備上的顯示效果相同。這里的“相同”指的是像素不會(huì)變。第一個(gè)問(wèn)題:比如一個(gè)button的寬是100px,那么無(wú)論是在120,160,還是240像素密度 的設(shè)備上,它的寬都應(yīng)該顯示100px。,比如我們有三個(gè)480x320的手機(jī),它的dpi 分 別為:120,160,180。那么此時(shí),如果它在160dpi的手機(jī)上顯示3厘米,在120dpi的 手機(jī)上就會(huì)顯示(4/3)*3厘米,就比160dpi上顯示的要大了,同理,在240dpi上顯示的 按鈕看起來(lái)就更窄了。而這里我們的手機(jī)是一樣大的,這就出現(xiàn)了不適應(yīng)屏幕的問(wèn)題。

這就是我們不推薦不使用px的原因之一,因?yàn)閜x與手機(jī)的像素密度有直接的關(guān)系

第二個(gè)問(wèn)題:比如我們有三個(gè)手機(jī),它的dpi都為120,而屏幕尺寸分別為【寬度為更 小的那個(gè)值】:320*240,480*320,640*480。我們需要在屏幕的第一行放一個(gè)按 鈕,讓它 占滿屏幕。設(shè)計(jì)的時(shí)候,我們?cè)?80*320的手機(jī)上設(shè)置好了大小,比如為180px,當(dāng)把 這個(gè)程序運(yùn)行在320*240的手機(jī)上時(shí),而明顯,這個(gè)按鈕是顯示不全的,而在640*480 的手機(jī)上它又是占不滿的。這就是我們不推薦不使用px的原因之二,因?yàn)閜x與手機(jī)的屏幕有直接的關(guān)系。

由于有上面的問(wèn)題,android中我們一般就推薦使用dip,而不使用px。

dp:dp是dip的縮寫,它是device-independent pixel,即設(shè)備獨(dú)立像素。它是一個(gè)與像素密 度和屏幕尺寸都無(wú)關(guān)的單位。在不同的屏幕上有不同的顯示效果。它與像素px的換算 公式為:px = (像素密度/160)*dp。

上面已經(jīng)說(shuō)過(guò),android中常用的像素密度有120,160,240。那么在160dpi的設(shè)備上, 1px=1dp。

解決第一個(gè)問(wèn)題:還是三個(gè)480x320的手機(jī),它的dpi 分別為:120,160,180。我們將 一個(gè)按鈕的寬度設(shè)置為:100dp。根據(jù)上面的換算單位,它在160dpi的手機(jī)上顯示的像 素為100px,即上面的3cm。那么在120dpi的手機(jī)上它顯示的像素就為(3/4)*100px,換 算成厘米為:(4/3)*(3/4),還是相當(dāng)于在160dpi上的顯示寬度,即3cm。同理可得到在 240dpi的設(shè)備上,它的顯示寬度也為3厘米。

sp:放大像素,即ScaledPixels。它主要用于字體的顯示,他會(huì)根據(jù)像素密度來(lái)放大或者縮 寫字體。

2、android中的drawable和layout。

對(duì)于API 1.6及以上版本的應(yīng)用程序中,可以使用drawable,drawable-hdpi,drawable-ldpi,drawable-mdpi,drawable-xdpi的文件夾來(lái)在不同的像素密度下使用的圖片。使用layout-small,layout-normal,layout-large,layout-xlarge來(lái)存放不同屏幕尺寸下使用的布局文件。其在android應(yīng)用程序中所對(duì)應(yīng)的實(shí)際設(shè)備的轉(zhuǎn)換關(guān)系如下圖:

Android系統(tǒng)對(duì)drawable,drawable-hdpi,drawable-ldpi,drawable-mdpi,drawable-xdpi中存放的圖片進(jìn)行選擇的規(guī)則是:先去匹配此密度下對(duì)應(yīng)的圖片資源,如果沒(méi)有,就去使用drawable目錄下的圖片資源。比如,有一個(gè)設(shè)備像素密度是240dpi,那么此時(shí)它將優(yōu)先使用drawable-hdpi目錄下的圖片資源,但是如果drawable-hdpi目錄不存在,它就會(huì)去使用drawable目錄下的資源文件。

在android中除了使用上面的五種布局外,還可以使用layout-axb和layout-swadp的方式來(lái)存放布局文件。比如layout-480x360和layout-sw600dp。經(jīng)過(guò)測(cè)試,總結(jié)出如下的匹配規(guī)則:

假設(shè)在某個(gè)應(yīng)用程序中存在如下的布局文件:

Layout-xlarge,layout-large,layout-normal,layout-small,layout,layout-sw500dp,layout-1280x800,layout-1280x888,layout-1280x750,layout-sw1280dp,layout-sw1dp。

對(duì)于所有版本的API(2.2,3.0,3.2,4.0測(cè)試均是如下結(jié)果):

A、首先去匹配layout-xlarge,接著是layout-large,然后是layout-normal,最后是layout-small。上述中的任一一個(gè)可以匹配成功,布局文件就匹配成功。

B、如果匹配未成功,就會(huì)去找layout-swadp這個(gè)文件,如果可以找到adp能比屏幕寬度小的,就匹配成功。即使你的屏幕是:1280x800,如果layout中有l(wèi)ayout-sw1dp,且第一個(gè)條件未被匹配,而layout-swadp又只有這一個(gè),那么此時(shí),不管其他還有什么布局文件,layout-sw1dp都會(huì)去匹配,即使你的布局文件中有l(wèi)ayout-1280x800。

C、如果上面兩中情況都未匹配到,此時(shí)就要分版本來(lái)匹配layout-axb文件了:

3.2以前的版本:

只有當(dāng)layout-axb完全匹配時(shí),才去使用這個(gè)布局文件,否則使用layout。也就是說(shuō),我的屏幕是1280x800,api版本是1.6-3.0,那么此時(shí)如果布局文件中有l(wèi)ayout-1280x750而沒(méi)有l(wèi)ayou-1280x800,也就說(shuō)不能完全匹配,那么系統(tǒng)會(huì)選用layout這個(gè)布局文件來(lái)進(jìn)行匹配。

3.2以后的版本:

如果layout-axb能完全匹配,就使用這個(gè)布局文件,如果不能匹配,就去找a和b都要比它的屏幕小,并且最接近的那個(gè)布局文件。但是前提條件是:如果是大屏幕,你給的布局文件尺寸比normal的大,如果是小屏幕,你給的布局文件比normal的小。

3、屏幕自適應(yīng)解決方法

A、使用wrap-content和match-parent(api2.2之前使用fill-parent),即寬高根據(jù)內(nèi)容調(diào)整以及伸展至父控件一致。而不是硬編碼寫死控件的大小。

B、使用相對(duì)布局(RelativeLayout)

使用相對(duì)的布局方式來(lái)進(jìn)行控件的擺放,這種方式靈活性大,但是也相對(duì)復(fù)雜。

C、使用FrameLayout,即幀布局可以在一定程度上消除屏幕尺寸帶來(lái)的問(wèn)題。

D、使用layout-xlarge,layout-large,layout-small這種方式來(lái)建立多個(gè)布局文件。使用這種方式可以僅用四個(gè)布局文件就匹配所有高于1.6版本的應(yīng)用。并且效果比只用一個(gè)layout要好很多。

E、使用最小寬度標(biāo)識(shí)符,也就是layout-swaaaadp的方式。官方在3.2的新特性中特別申明了如下四種方式用于使用3.2版本的平板建議使用的布局方式,如下:

res/layout-sw600dp/main_activity.xml  // 7英寸平板

res/layout-sw720dp/main_activity.xml  //10英寸平板
res/layout-w600dp/main_activity.xml   //根據(jù)寬度自適應(yīng)
res/layout-sw600dp-w720dp/main_activity.xml  //超寬的布局

F、使用layout-axb這種方式來(lái)進(jìn)行屏幕自適應(yīng)。

由于在3.2版本之前只有當(dāng)layout-axb完全匹配時(shí),才會(huì)去使用這個(gè)布局文件,但是在3.2以后可以最接近匹配,所有在電視版中可以使用這種方式進(jìn)行布局。

G、一些重要的圖片,比如logo,主頁(yè)面的那些圖片可以使用9.png圖片,因?yàn)檫@種圖片拉伸后不會(huì)出現(xiàn)很嚴(yán)重的失真,所以顯示效果會(huì)相比于普通的png圖片要好。

9.png圖片的更多信息可以看這里:http://www.himigame.com/android-game/321.html

H、使用drawable-hdpi,drawable-mdpi這種方式來(lái)定義不同的圖片,可以幫助我們適應(yīng)不同的屏幕密度。使用dp和sp可以幫助我們更好的進(jìn)行布局。

新聞名稱:android屏幕自適應(yīng)研究-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article38/ceejpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈軟件開(kāi)發(fā)、定制網(wǎng)站、搜索引擎優(yōu)化靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司