多屏幕適配相關(guān)(多屏協(xié)同適配機(jī)型)
android – 多屏幕適配相關(guān)
1、基本概念
屏幕大小(screen size)?– 屏幕的實(shí)際大小,用屏幕對(duì)角線(xiàn)長(zhǎng)度來(lái)衡量(比如3.4寸,3.8寸)。android把屏幕分為以下4種:small,normal,large,extra large。
怎么判斷?
屏幕密度(Screen Density) -??一塊實(shí)際的屏幕區(qū)域有多少個(gè)像素,一般用dpi衡量(每英寸有多少個(gè)點(diǎn))。相比起medium、high屏幕密度的設(shè)備,在一塊確定大小的屏幕區(qū)域l密度為low的屏幕擁有的像素更少。android把屏幕密度分為4種:low,medium,high,extra high。
如何判斷是ldpi,mdpi,hdpi?
方向(orientation) -??屏幕方向分為landscape(橫屏)和portrait(豎屏)。
分辨率(Resolution)?-??屏幕上的總實(shí)際像素?cái)?shù)。對(duì)屏幕進(jìn)行適配時(shí),一般不關(guān)注它的分辨率,只關(guān)注它的屏幕大小和密度。
與密度無(wú)關(guān)的像素(Density-independent pixel,dp或dip)?-??為了保證你的UI適合不同的屏幕密度,建議你采用dp來(lái)定義程序UI。
它的計(jì)算方法為:px = dp * (dpi / 160)
sp(scale-independent pixel)
計(jì)算屏幕密度
2、怎樣適配多種屏幕
a.在manifest里定義你的程序支持的屏幕類(lèi)型,相應(yīng)代碼如下:
android:smallScreens=["true" | "false"]?? //是否支持小屏 android:normalScreens=["true" | "false"]? //是否支持中屏 android:largeScreens=["true" | "false"]?? //是否支持大屏 android:xlargeScreens=["true" | "false"] ?//是否支持超大屏 android:anyDensity=["true" | "false"]??? //是否支持多種不同密度的屏幕 android:requiresSmallestWidthDp=”integer” android:compatibleWidthLimitDp=”integer” android:largestWidthLimitDp=”integer”/> b.對(duì)不同大小的屏幕提供不同的layout。 比如,如果需要對(duì)大小為large的屏幕提供支持,需要在res目錄下新建一個(gè)文件夾layout-large/并提供layout。當(dāng)然,也可以在res目錄下建立layout-port和layout-land兩個(gè)目錄,里面分別放置豎屏和橫屏兩種布局文件,以適應(yīng)對(duì)橫屏豎屏自動(dòng)切換。 c.對(duì)不同密度的屏幕提供不同的圖片。 應(yīng)盡量使用點(diǎn)9格式的圖片,如需對(duì)密度為low的屏幕提供合適的圖片,需新建文件夾drawable-ldpi/,并放入合適大小的圖片。相應(yīng)的,medium對(duì)應(yīng)drawable-mdpi /,high對(duì)應(yīng)drawable-hdpi/,extra high對(duì)應(yīng)drawable-xhdpi/。 圖片大小的確定:low:medium:high:extra high比例為3:4:6:8。舉例來(lái)說(shuō),對(duì)于中等密度(medium)的屏幕你的圖片像素大小為48×48,那么低密度(low)屏幕的圖片大小應(yīng)為36×36,高(high)的為72×72,extra high為96×96。 不同密度的屏幕對(duì)應(yīng)的圖片比例 3、多屏幕適配的4條黃金原則 a.在layout文件中設(shè)置控件尺寸時(shí)應(yīng)采用wrap_content,fill_parent和dp。 具體來(lái)說(shuō),設(shè)置view的屬性android:layout_width和android:layout_height的值時(shí),wrap_content,fill_parent或dp比pix更好。相應(yīng)地,為了使文字大小更好的適應(yīng)屏幕應(yīng)該使用sp來(lái)定義文字大小。 b.在程序的代碼中不要出現(xiàn)具體的像素值。 為了使代碼簡(jiǎn)單,android內(nèi)部使用pix為單位表示控件的尺寸,但這是基于當(dāng)前屏幕基礎(chǔ)上的。為了適應(yīng)多種屏幕,android建議開(kāi)發(fā)者不要使用具體的像素來(lái)表示控件尺寸。 c.不要使用AbsoluteLayout(android1.5已廢棄)?。相應(yīng)地,應(yīng)使用RelativeLayout。 d.對(duì)不同的屏幕提供合適大小的圖片。見(jiàn)上面第2部分。 4、需要注意的地方 以上設(shè)置適用于android3.2以下的版本。(本人目前開(kāi)發(fā)是在android2.2上,這部分以后再補(bǔ)充) 5、怎樣測(cè)試你的程序是否支持多屏幕適配 一般使用AVD Manager創(chuàng)建多個(gè)不同大小的模擬器,如下圖 6、參考文檔:http://developer.android.com/guide/practices/screens_support.html Android多屏幕適配 標(biāo)簽: multiple screen android density? size 問(wèn)題: 測(cè)試時(shí),發(fā)現(xiàn)應(yīng)用在不同的顯示器上顯示效果不同(部分文本不能顯示完全),自然想到屏幕適配的問(wèn)題。 按照思路整理如下: (一) 幾個(gè)概念 1,?Screen size?屏幕的尺寸,即對(duì)角線(xiàn)長(zhǎng)度(單位inch-英寸) 2, Screen density屏幕密度,即單位長(zhǎng)度像素點(diǎn)數(shù)(pots/inches) 3, Resolution 分辨率,即屏幕的總像素點(diǎn)數(shù)(width * height) 4, Density-independent pixel (dp)獨(dú)立像素密度。標(biāo)準(zhǔn)是160dip.即1dp對(duì)應(yīng)1個(gè)pixel,計(jì)算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp對(duì)應(yīng) 的像素點(diǎn)越多。 (二) 屏幕的分類(lèi)(size & density) 1, 以總像素?cái)?shù)分,文本的size等都要改,如下圖所示 每一個(gè)分類(lèi)都有其最小分辨率,如下,可根據(jù)分辨率劃分種類(lèi): 2, 以屏幕密度分,提供不同的圖片如下圖所示 Note1:匹配以上面兩種為參考。 Note2:還有專(zhuān)為水平(landscape)和豎直(portrait)兩種,使用的少,在此不贅述。 (三) Android尋找最佳資源原理 1, 排除與設(shè)備設(shè)置不符合的資源 2, 根據(jù)限定詞(qualifier)的優(yōu)先級(jí),按照順序查找 3, 在限定詞下,是否存在資源路徑 4, 排除不包含在限定詞中的資源路徑 5, ?繼續(xù)執(zhí)行不同的限定詞查找,直到找到相應(yīng)的資源 如下圖所示: (四) 項(xiàng)目步驟: 1, manufest中配置 android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:xlargeScreens="true"?/> 2, 新建對(duì)應(yīng)的資源文件夾 A, Layout 例如,我現(xiàn)在有三個(gè)顯示器分辨率: 分別為1280*720,1024*768,1200*690 根據(jù)以上最低分辨率的要求,分為xlarge和large兩類(lèi),新建兩個(gè)文件夾,如下: 如下圖所示: B, Drawable 如下圖所示: 在drawable中,以mdpi為標(biāo)準(zhǔn)(即160dpi)。比例保持為3:4:5:6,如下圖所示: 本文出自 “小新專(zhuān)欄” 博客,請(qǐng)務(wù)必保留此出處http://mikewang.blog.51cto.com/3826268/865304 Android 多屏幕支持 另外一篇 http://blog.csdn.net/zj_133/article/details/7281140 多國(guó)語(yǔ)言文件夾 http://guojianhui0906.iteye.com/blog/1271827 1.術(shù)語(yǔ)和概念 術(shù)語(yǔ) 說(shuō)明 備注 Screen size(屏幕尺寸) 指的是手機(jī)實(shí)際的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸(對(duì)角線(xiàn)長(zhǎng)度) 摩托羅拉milestone手機(jī)是3.7英寸 Aspect Ratio(寬高比率) 指的是實(shí)際的物理尺寸寬高比率,分為long和nolong Milestone是16:9,屬于long Resolution(分辨率) 和電腦的分辨率概念一樣,指手機(jī)屏幕縱、橫方向像素個(gè)數(shù) Milestone是854*480 DPI(dot per inch) 每英寸像素?cái)?shù),如120dpi,160dpi等,假設(shè)QVGA(320*240)分辨率的屏幕物理尺寸是(2英寸*1.5英寸),dpi=160 所以dpi = 分辨率的高寬的平方根(對(duì)角線(xiàn))除以物理尺寸高寬的平方根(對(duì)角線(xiàn)). 可以反映屏幕的清晰度,用于縮放UI的 Density(密度) 屏幕里像素值濃度,resolution/Screen size可以反映出手機(jī)密度, ? ?(dpi/160) Density-independent pixel (dip) 指的是邏輯密度計(jì)算單位,dip和具體像素值的對(duì)應(yīng)公式是pixel/dip=dpi值/160,也就是pixel = dip * (dpi / 160) Px (Pixel像素: ? ??不同設(shè)備顯示效果相同。這里的“相同”是指像素?cái)?shù)不會(huì)變,比如指定UI長(zhǎng)度是100px,那不管分辨率是多少UI長(zhǎng)度都是100px。也正是因?yàn)槿绱瞬旁斐闪薝I在小分辨率設(shè)備上被放大而失真,在大分辨率上被縮小。 2. DPI值計(jì)算 比如:計(jì)算WVGA(800*480)分辨率,3.7英寸的密度DPI,如圖1所示 圖1 Diagonal pixel表示對(duì)角線(xiàn)的像素值(=),DPI=933/3.7=252 3.手機(jī)屏幕的分類(lèi) 3.1根據(jù)手機(jī)屏幕密度(DPI)或屏幕尺寸大小分為以下3類(lèi),如圖2所示 圖2 3. 2手機(jī)屏幕分類(lèi)和像素密度的對(duì)應(yīng)關(guān)系如表1所示: Low density (120), ldpi Medium density (160), mdpi High density (240), hdpi Small screen QVGA (240x320) Normal screen WQVGA400 (240x400)WQVGA432 (240x432) HVGA (320x480) WVGA800 (480x800)WVGA854 (480x854) Large screen WVGA800* (480x800)WVGA854* (480x854) 表1 3.3手機(jī)尺寸分布情況(http://developer.android.com/resources/dashboard/screens.html)如圖3所示,目前主要是以分辨率為800*480和854*480的手機(jī)用戶(hù)居多 圖3 從以上的屏幕尺寸分布情況上看,其實(shí)手機(jī)只要考慮3-4.5寸之間密度為1和1.5的手機(jī) 4 UI設(shè)計(jì) 從開(kāi)發(fā)角度講,應(yīng)用程序會(huì)根據(jù)3類(lèi)Android手機(jī)屏幕提供3套UI布局文件,但是相應(yīng)界面圖標(biāo)也需要提供3套,如表2所示 Icon Type Standard Asset Sizes (in Pixels), for Generalized Screen Densities Low density screen (ldpi) Medium density screen (mdpi) High density screen (hdpi) Launcher 36 x 36 px 48 x 48 px 72 x 72 px Menu 36 x 36 px 48 x 48 px 72 x 72 px Status Bar 24 x 24 px 32 x 32 px 48 x 48 px Tab 24 x 24 px 32 x 32 px 48 x 48 px Dialog 24 x 24 px 32 x 32 px 48 x 48 px List View 24 x 24 px 32 x 32 px 48 x 48 px 表2 5 如何做到自適應(yīng)屏幕大小呢? 1)界面布局方面 需要根據(jù)物理尺寸的大小準(zhǔn)備5套布局,layout(放一些通用布局xml文件,比如界面中頂部和底部的布局,不會(huì)隨著屏幕大小變化,類(lèi)似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之間),layout-xlarge(7-10英寸之間) 2)圖片資源方面 需要根據(jù)dpi值準(zhǔn)備5套圖片資源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi Android有個(gè)自動(dòng)匹配機(jī)制去選擇對(duì)應(yīng)的布局和圖片資源 四種屏幕尺寸分類(lèi):: small, normal, large, and xlarge 四種密度分類(lèi): ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) 需要注意的是: xhdpi是從?Android?2.2 (API Level 8)才開(kāi)始增加的分類(lèi). xlarge是從Android 2.3 (API Level 9)才開(kāi)始增加的分類(lèi). DPI是“dot per inch”的縮寫(xiě),每英寸像素?cái)?shù)。 一般情況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。 兩種獲取屏幕分辨率信息的方法: DisplayMetrics metrics = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); //這里得到的像素值是設(shè)備獨(dú)立像素dp //DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 這樣獲得的參數(shù)信息不正確,不要使用這種方式。 不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。這個(gè)得到的寬和高是空的。 如果需要為Android pad定制資源文件,則res目錄下的目錄可能為: drawable drawable-ldpi drawable-mdpi drawable-hdpi drawable-xhdpi drawable-nodpi drawable-nodpi-1024×600 drawable-nodpi-1280×800 drawable-nodpi-800×480 values values-ldpi values-mdpi values-hdpi values-xhdpi values-nodpi values-nodpi-1024×600 values-nodpi-1280×800 values-nodpi-800×480 Android 獲取屏幕尺寸與密度: android中獲取屏幕的長(zhǎng)于寬,參考了網(wǎng)上有很多代碼,但結(jié)果與實(shí)際不符,如我的手機(jī)是i9000,屏幕大小是480*800px,得到的結(jié)果卻為320*533 結(jié)果很不靠譜,于是自己寫(xiě)了幾行代碼,親測(cè)一下 測(cè)試參數(shù): 測(cè)試環(huán)境: i9000(三星) 物理屏幕:480*800px density :1.5 測(cè)試代碼: Java代碼 //?獲取屏幕密度(方法1) int?screenWidth??=?getWindowManager().getDefaultDisplay().getWidth();???????//?屏幕寬(像素,如:480px) int?screenHeight?=?getWindowManager().getDefaultDisplay().getHeight();??????//?屏幕高(像素,如:800p) Log.e(TAG?+?"??getDefaultDisplay",?"screenWidth="?+?screenWidth?+?";?screenHeight="?+?screenHeight); //?獲取屏幕密度(方法2) DisplayMetrics?dm?=?new?DisplayMetrics(); dm?=?getResources().getDisplayMetrics(); float?density??=?dm.density;????????//?屏幕密度(像素比例:0.75/1.0/1.5/2.0) int?densityDPI?=?dm.densityDpi;?????//?屏幕密度(每寸像素:120/160/240/320) float?xdpi?=?dm.xdpi; float?ydpi?=?dm.ydpi; Log.e(TAG?+?"??DisplayMetrics",?"xdpi="?+?xdpi?+?";?ydpi="?+?ydpi); Log.e(TAG?+?"??DisplayMetrics",?"density="?+?density?+?";?densityDPI="?+?densityDPI); screenWidth??=?dm.widthPixels;??????//?屏幕寬(像素,如:480px) screenHeight?=?dm.heightPixels;?????//?屏幕高(像素,如:800px) Log.e(TAG?+?"??DisplayMetrics(111)",?"screenWidth="?+?screenWidth?+?";?screenHeight="?+?screenHeight); //?獲取屏幕密度(方法3) dm?=?new?DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); density??=?dm.density;??????//?屏幕密度(像素比例:0.75/1.0/1.5/2.0) densityDPI?=?dm.densityDpi;?????//?屏幕密度(每寸像素:120/160/240/320) xdpi?=?dm.xdpi; ydpi?=?dm.ydpi; Log.e(TAG?+?"??DisplayMetrics",?"xdpi="?+?xdpi?+?";?ydpi="?+?ydpi); Log.e(TAG?+?"??DisplayMetrics",?"density="?+?density?+?";?densityDPI="?+?densityDPI); int?screenWidthDip?=?dm.widthPixels;????????//?屏幕寬(dip,如:320dip) int?screenHeightDip?=?dm.heightPixels;??????//?屏幕寬(dip,如:533dip) Log.e(TAG?+?"??DisplayMetrics(222)",?"screenWidthDip="?+?screenWidthDip?+?";?screenHeightDip="?+?screenHeightDip); screenWidth??=?(int)(dm.widthPixels?*?density?+?0.5f);??????//?屏幕寬(px,如:480px) screenHeight?=?(int)(dm.heightPixels?*?density?+?0.5f);?????//?屏幕高(px,如:800px) Log.e(TAG?+?"??DisplayMetrics(222)",?"screenWidth="?+?screenWidth?+?";?screenHeight="?+?screenHeight); Java代碼 E/==?MyScreenActivity?===================================??getDefaultDisplay(?8509):?screenWidth=320;?screenHeight=533 E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?xdpi=156.3077;?ydpi=157.51938 E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?density=1.0;?densityDPI=160 E/==?MyScreenActivity?===================================??DisplayMetrics(111)(?8509):?screenWidth=320;?screenHeight=533 E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?xdpi=234.46153;?ydpi=236.27907 E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?density=1.5;?densityDPI=240 E/==?MyScreenActivity?===================================??DisplayMetrics(222)(?8509):?screenWidthDip=320;?screenHeightDip=533 E/==?MyScreenActivity?===================================??DisplayMetrics(222)(?8509):?screenWidth=480;?screenHeight=800 在onDraw()方法中 方法1和2,得到的結(jié)果都一致,均為320*533,明顯不是測(cè)試機(jī)i9000的屏幕大小 方法3,將方法1和2得到的結(jié)果,乘以density后,完美的480*800,perfect! 注:density 大于1的情況下,需要設(shè)置targetSdkVersion在4-9之間,例如 但是,這就說(shuō)明方法3一定是通用的嗎? 回答是否定的,因?yàn)槲乙苍谀M器、HTC G14物理機(jī),以及ViewSonic、Galaxy平板上測(cè)試過(guò),方法3在density=1.5時(shí),放大了實(shí)際屏幕值,例如:HTC G14 在HTC G14上,實(shí)際屏幕大小,直接通過(guò)dm.widthPixels、dm.heightPixels便得到了實(shí)際物理屏幕大小(540,960) 仔細(xì)分析代碼,發(fā)現(xiàn)問(wèn)題出在代碼: getWindowManager().getDefaultDisplay().getMetrics(dm) Initialize a DisplayMetrics?object from this display's data. dm = getResources().getDisplayMetrics() Return the?current display metrics?that are in effect for this resource object. The returned object should be treated as read-only. 手機(jī)尺寸分布情況(http://developer.android.com/resources/dashboard/screens.html)如圖所示, 目前主要是以分辨率為800*480和854*480的手機(jī)用戶(hù)居多 從以上的屏幕尺寸分布情況上看,其實(shí)手機(jī)只要考慮3-4.5寸之間密度為1和1.5的手機(jī) 2、android多屏幕支持機(jī)制 Android的支持多屏幕機(jī)制即用為當(dāng)前設(shè)備屏幕提供一種合適的方式來(lái)共同管理并解析應(yīng)用資源。 Android平臺(tái)中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合適資源。 指定大小(size-specific)的合適資源是指small, normal, large, and xlarge。 指定密度(density-specific)的合適資源,是指ldpi (low), mdpi (medium), hdpi(high), and xhdpi (extra high). Android有個(gè)自動(dòng)匹配機(jī)制去選擇對(duì)應(yīng)的布局和圖片資源 1)界面布局方面 根據(jù)物理尺寸的大小準(zhǔn)備5套布局: layout(放一些通用布局xml文件,比如界面頂部和底部的布局,不會(huì)隨著屏幕大小變化,類(lèi)似windos窗口的titlebar), layout-small(屏幕尺寸小于3英寸左右的布局), layout-normal(屏幕尺寸小于4.5英寸左右), layout-large(4英寸-7英寸之間), layout-xlarge(7-10英寸之間) 2)圖片資源方面 需要根據(jù)dpi值準(zhǔn)備5套圖片資源: drawable:主要放置xml配置文件或者對(duì)分辨率要求較低的圖片 drawalbe-ldpi:低分辨率的圖片,如QVGA (240x320) drawable-mdpi:中等分辨率的圖片,如HVGA (320x480) drawable-hdpi:高分辨率的圖片,如WVGA (480x800),FWVGA (480x854) drawable-xhdpi:至少960dp x 720dp Android有個(gè)自動(dòng)匹配機(jī)制去選擇對(duì)應(yīng)的布局和圖片資源。 系統(tǒng)會(huì)根據(jù)機(jī)器的分辨率來(lái)分別到這幾個(gè)文件夾里面去找對(duì)應(yīng)的圖片。 在開(kāi)發(fā)程序時(shí)為了兼容不同平臺(tái)不同屏幕,建議各自文件夾根據(jù)需求均存放不同版本圖片。 3、AndroidManifest.xml 配置 ndroid從1.6和更高,Google為了方便開(kāi)發(fā)者對(duì)于各種分辨率機(jī)型的移植而增加了自動(dòng)適配的功能 android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:anyDensity="true"/> 3.1是否支持多種不同密度的屏幕 android:anyDensity=["true" | "false"] 如果android:anyDensity="true" 指應(yīng)用程序支持不同密度,會(huì)根據(jù)屏幕的分辨率自動(dòng)去匹配。 如果android:anyDensity="false" 應(yīng)用程序支持不同密度,系統(tǒng)自動(dòng)縮放圖片尺寸和這個(gè)圖片的坐標(biāo)。具體解釋一下系統(tǒng)是如何自動(dòng)縮放資源的。 例如我們?cè)趆dpi,mdpi,ldpi文件夾下?lián)碛型环N資源,那么應(yīng)用也不會(huì)自動(dòng)地去相應(yīng)文件夾下尋找資源,這種情況都是出現(xiàn)在高密度,以及低密度的手機(jī)上,比如說(shuō)一部240×320像素的手機(jī), 如果設(shè)置android:anyDensity="false",Android系統(tǒng)會(huì)將240 x 320(低密度)轉(zhuǎn)換為320×480(中密度),這樣的話(huà),應(yīng)用就會(huì)在小密度手機(jī)上加載mdpi文件中的資源。 3.2是否支持大屏幕 android:largeScreens=["true" | "false"] 如果在聲明不支持的大屏幕,而這個(gè)屏幕尺寸是larger的話(huà),系統(tǒng)使用尺寸為("normal")和密度為("medium)顯示, 不過(guò)會(huì)出現(xiàn)一層黑色的背景。 3.3是否支持小屏幕 android:smallScreens=["true" | "false"] 如果在聲明不支持的小屏幕,而當(dāng)前屏幕尺寸是smaller的話(huà),系統(tǒng)也使用尺寸為("normal")和密度為("medium)顯示 如果應(yīng)用程序能在小屏幕上正確縮放(最低是small尺寸或最小寬度320dp),那就不需要用到本屬性。否則,就應(yīng)該為最小屏幕寬度標(biāo)識(shí)符設(shè)置本屬性 來(lái)匹配應(yīng)用程序所需的最小尺寸。 4、Android提供3種方式處理屏幕自適應(yīng) 4.1預(yù)縮放的資源(基于尺寸和密度去尋找圖片) 1)如果找到相應(yīng)的尺寸和密度,則利用這些圖片進(jìn)行無(wú)縮放顯示。 2)如果沒(méi)法找到相應(yīng)的尺寸,而找到密度,則認(rèn)為該圖片尺寸為 "medium",利用縮放顯示這個(gè)圖片。 3)如果都無(wú)法匹配,則使用默認(rèn)圖片進(jìn)行縮放顯示。默認(rèn)圖片默認(rèn)標(biāo)配 "medium" (160)。 4.2自動(dòng)縮放的像素尺寸和坐標(biāo)(密度兼容) 1)如果應(yīng)用程序不支持不同密度android:anyDensity="false",系統(tǒng)自動(dòng)縮放圖片尺寸和這個(gè)圖片的坐標(biāo)。 2)對(duì)于預(yù)縮放的資源,當(dāng)android:anyDensity="false",也不生效。 3)android:anyDensity="false",只對(duì)密度兼容起作用,尺寸兼容沒(méi)效果 4.3兼容更大的屏幕和尺寸(尺寸兼容) 1)對(duì)于你在聲明不支持的大屏幕,而這個(gè)屏幕尺寸是normal的話(huà),系統(tǒng)使用尺寸為???("normal")和密度為("medium)顯示。 2.)對(duì)于你在聲明不支持的大屏幕,而這個(gè)屏幕尺寸是larger的話(huà),系統(tǒng)同樣使用尺寸為("normal")和密度為("medium)顯示, 不過(guò)會(huì)出現(xiàn)一層黑色的背景。 5、Android系統(tǒng)自動(dòng)適配技巧 Android系統(tǒng)采用下面兩種方法來(lái)實(shí)現(xiàn)應(yīng)用的自動(dòng)適配: 1)布局文件中定義長(zhǎng)度的時(shí)候,最好使用wrap_content,fill_parent, 或者dp進(jìn)行描述,這樣可以保證在屏幕上面展示的時(shí)候有合適的大小 2)為不同屏幕密度的手機(jī),提供不同的位圖資源,可以使得界面清晰無(wú)縮放。 對(duì)應(yīng)bitmap資源來(lái)說(shuō),自動(dòng)的縮放有時(shí)會(huì)造成放大縮小后的圖像變得模糊不清,這是就需要應(yīng)用為不同屏幕密度配置提供不同的資源:為高密度的屏幕提供高清晰度的圖像等。 3)不要使用AbsoluteLayout 4)像素單位都使用DIP,文本單位使用SP 6、在代碼中獲取屏幕像素、屏幕密度 DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels;??// 屏幕寬度(像素) int height = metric.heightPixels;??//屏幕高度(像素) float density = metric.density;??// 屏幕密度(0.75 /1.0 / 1.5) int densityDpi = metric.densityDpi;??//屏幕密度DPI(120 / 160 / 240) 7、 一般多分辨率處理方法及其缺點(diǎn) 7.1 圖片縮放 基于當(dāng)前屏幕的精度,平臺(tái)自動(dòng)加載任何未經(jīng)縮放的限定尺寸和精度的圖片。如果圖片不匹配,平臺(tái)會(huì)加載默認(rèn)資源并且在放大或者縮小之后可以滿(mǎn)足當(dāng)前界面的顯示要求。例如,當(dāng)前為高精度屏幕,平臺(tái)會(huì)加載高精度資源(如HelloAndroid中drawable-hdpi中的位圖資源),如果沒(méi)有,平臺(tái)會(huì)將中精度資源縮放至高精度,導(dǎo)致圖片顯示不清晰。 7.2 自動(dòng)定義像素尺寸和位置 如果程序不支持多種精度屏幕,平臺(tái)會(huì)自動(dòng)定義像素絕對(duì)位置和尺寸值等,這樣就能保證元素能和精度160的屏幕上一樣能顯示出同樣尺寸的效果。例如,要讓W(xué)VGA 高精度屏幕和傳統(tǒng)的HVGA屏幕一樣顯示同樣尺寸的圖片,當(dāng)程序不支持時(shí),系統(tǒng)會(huì)對(duì)程序慌稱(chēng)屏幕分辨率為320×480,在(10,10)到(100,100)的區(qū)域內(nèi)繪制圖形完成之后,系統(tǒng)會(huì)將圖形放大到(15,15)到(150,150)的屏幕顯示區(qū)域。 7.3 兼容更大尺寸的屏幕 當(dāng)前屏幕超過(guò)程序所支持屏幕的上限時(shí),定義supportsscreens元素,這樣超出顯示的基準(zhǔn)線(xiàn)時(shí),平臺(tái)在此顯示黑色的背景圖。例如,WVGA中精度屏幕上,如程序不支持這樣的大屏幕,系統(tǒng)會(huì)謊稱(chēng)是一個(gè)320×480 的,多余的顯示區(qū)域會(huì)被填充成黑色。 7.4 采用OpenGL 動(dòng)態(tài)繪制圖片 Android 底層提供了OpenGL的接口和方法,可以動(dòng)態(tài)繪制圖片,但是這種方式對(duì)不熟悉計(jì)算機(jī)圖形學(xué)的開(kāi)發(fā)者來(lái)講是一個(gè)很大的挑戰(zhàn)。一般開(kāi)發(fā)游戲,采用OpenGL方式。 7.5 多個(gè)apk 文件 Symbian 和傳統(tǒng)的J2ME就是采用這種方式,為一款應(yīng)用提供多個(gè)分辨率版本,用戶(hù)根據(jù)自己的需求下載安裝相應(yīng)的可執(zhí)行文件。針對(duì)每一種屏幕單獨(dú)開(kāi)發(fā)應(yīng)用程序不失為一種好方法,但是目前GoogleMarket 對(duì)一個(gè)應(yīng)用程序多個(gè)分辨率版本的支持還不完善,開(kāi)發(fā)者還是需要盡可能使用一個(gè)apk 文件適應(yīng)多個(gè)分辨率。 出處:http://blog.sina.com.cn/staratsky Android的支持多屏幕的原理是一套內(nèi)置的兼容性特征,即用為當(dāng)前設(shè)備屏幕提供一種合適的方式來(lái)共同管理并解析應(yīng)用資源。雖然android平臺(tái)負(fù)責(zé)大部分解析應(yīng)用的工作,但是也為開(kāi)發(fā)者提供了如何控制應(yīng)用呈現(xiàn)的兩個(gè)關(guān)鍵方法,它們的使用方法如下: Android平臺(tái)中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合適資源。指定大小(size-specific)的合適資源是指small,?normal,?large, and?xlarge。指定密度(density-specific)的合適資源,是指ldpi?(low),?mdpi?(medium),?hdpi?(high), and?xhdpi?(extra high). Android平臺(tái)還提供? android:normalScreens,?android:largeScreens, and?android:xlargeScreens.它可以用來(lái)指定應(yīng)用程序支持哪些尺寸屏幕。 在應(yīng)用程序運(yùn)行的時(shí)候,android平臺(tái)將提供三種方式支持應(yīng)用程序,以確保應(yīng)用程序以盡可能好的效果呈現(xiàn)在當(dāng)前設(shè)備屏幕上,這三種具體方式如下: 1、預(yù)前縮放(pro-scaling)資源(如圖片) 基于當(dāng)前屏幕的密度,android平臺(tái)會(huì)從應(yīng)用程序自動(dòng)加載指定大小,與密度的資源(均未縮放),如果沒(méi)有適配的資源可用,平臺(tái)將加載默認(rèn)文件夾下的資源(即drawable文件夾中的資源)并根據(jù)需要縮小或放大資源以適配當(dāng)前屏幕的一般屏幕密度。除非資源被加載到指定密度目錄下,一般情況平臺(tái)加載的默認(rèn)資源是展現(xiàn)效果最好的,展現(xiàn)在基于最基本密度為"medium" (160)的屏幕上。 例如:如果當(dāng)前屏幕的密度為高密度(high),平臺(tái)將加載drawable-hdpi文件夾下的資源,使用時(shí)并不縮放圖片大小。如果drawable-hdpi中無(wú)資源可用,或無(wú)此文件夾,平臺(tái)將加載默認(rèn)資源即drawable文件里的資源,并且放大圖片大小,從基本密度到最大密度。 2、自動(dòng)縮放像素維值與坐標(biāo) 如果應(yīng)用程序不支持多屏幕,平臺(tái)將自動(dòng)縮放任何絕對(duì)像素坐標(biāo),像素維值,像素?cái)?shù)學(xué)。平臺(tái)如此做是為確保像素定義的屏幕元素更接近屏幕物理尺寸呈現(xiàn),像它們?cè)谧罨久芏?60上表現(xiàn)的一樣。平臺(tái)對(duì)于應(yīng)用程序的縮放很明顯,并且會(huì)認(rèn)為應(yīng)用程序屏幕大小為縮放后的像素維值而不是物理像素維值 例如:假定用一個(gè)WVGA的高密度屏幕,480*800,相當(dāng)于傳統(tǒng)HVGA的屏幕大小,但是運(yùn)行一個(gè)不支持多屏幕的應(yīng)用程序。在這種情況下,系統(tǒng)在獲取屏幕大小時(shí),會(huì)誤認(rèn)為是320*533。然后,會(huì)使從坐標(biāo)(10,10)到坐標(biāo)(100,100)的長(zhǎng)方形失效,系統(tǒng)將自動(dòng)縮放坐標(biāo)到合適大小,即從(15,15)到(150,150)。這種情況也會(huì)發(fā)生在其它地方,如果應(yīng)用程序運(yùn)行在低密度的屏幕上,坐標(biāo)也會(huì)被縮小 3、在大屏幕上的兼容模式 5.自動(dòng)縮放圖片比預(yù)縮放花費(fèi)更多CPU,但是用更少內(nèi)存(RAM or ROM ?) Android : dip/dp與px(pixel)之間的相互轉(zhuǎn)換 Author : Aoyousatuo Zhao http://blog.sina.com.cn/aoyousatuo 在A(yíng)ndroid應(yīng)用的開(kāi)發(fā)過(guò)程中,我們常常需要給組件布局定位。這就涉及到Android常用的兩個(gè)計(jì)量單位dip/dp, px.下面筆者就這兩個(gè)單位做一個(gè)簡(jiǎn)要的介紹。 dip或者dp是device independent pixels(設(shè)備獨(dú)立像素)的縮寫(xiě)。這個(gè)單位提出的目的主要是為了讓?xiě)?yīng)用的UI布局適應(yīng)各種分辨率的顯示設(shè)備。Android會(huì)將dp最終轉(zhuǎn)換成具體顯示設(shè)備的像素?cái)?shù),這樣就提高了程序的可移植性。 px是pixel的縮寫(xiě),它表示一個(gè)實(shí)實(shí)在在的物理像素。這個(gè)單位使用起來(lái)比較方便,但是組件一旦定位就固定了,它不會(huì)隨著設(shè)備的分辨率不同而改變,使用該單位的程序可移植性較差。 舉個(gè)例子,在400像素寬的屏幕上從第0個(gè)像素到第399個(gè)像素畫(huà)一條橫線(xiàn),我們可以看到這條線(xiàn)橫向貫穿了整個(gè)屏幕,然后我們將相同的畫(huà)線(xiàn)程序運(yùn)行在800像素寬的屏幕上,則我們只能看到這條線(xiàn)只有屏幕的一半。如果換作dp為單位,則在這兩種分辨率的屏幕上的線(xiàn)基本都橫向貫通。 所以在開(kāi)發(fā)中,為了提高程序?qū)Ω鞣N設(shè)備的適應(yīng)性,我們最好使用dp或者dip為單位。知道了這兩個(gè)單位的特點(diǎn),問(wèn)題就來(lái)了。我們發(fā)現(xiàn)雖然一些組件可以在布局文件中通過(guò)dip或者dp單位來(lái)定構(gòu)。但是,組件類(lèi)的相關(guān)方法卻只能以像素為單位。例如,設(shè)置GridView組件類(lèi)的列間距。這種情況下就涉及到了dip/dp與px之間的相互轉(zhuǎn)換。筆者直接給出兩個(gè)方法大家就清楚了,請(qǐng)看: public int dip2px(Context context, floatdipValue) { floatm=context.getResources().getDisplayMetrics().density ; return (int)(dipValue * m + 0.5f) ; } public int px2dip(Context context, floatpxValue) { float m=context.getResources().getDisplayMetrics().density; return (int)(pxValue / m + 0.5f) ; } 面對(duì)Android設(shè)備那混亂的硬件體系,最淡定的開(kāi)發(fā)者也會(huì)不免蛋疼起來(lái)。在做Android UI的時(shí)候,考慮最多的就是這些不同設(shè)備的適配問(wèn)題。在為不同分辨率設(shè)計(jì)不同UI的時(shí)候,我們首先要知道目標(biāo)設(shè)備的分辨率到底是多少。如何計(jì)算出來(lái)? 水果手機(jī)經(jīng)常喜歡用分辨率超過(guò)人眼極限來(lái)標(biāo)榜自己的設(shè)備有多么牛B,據(jù)說(shuō)iPhone 4S的分辨率達(dá)到了326 PPI(pixel per inch),這個(gè)數(shù)值的計(jì)算公式為: 開(kāi)方(屏幕寬度平方+屏幕高度平方)÷對(duì)角線(xiàn)尺寸 iPhone 4S,960×640像素,對(duì)角線(xiàn)尺寸3.5英寸,用上面的公式計(jì)算結(jié)果如下: sqrt(sqr(960) + sqr(640)) / 3.5 ≈ 329.65 看來(lái)水果公司并未說(shuō)謊。只是3.5寸的屏搞這么高的分辨率,考視力么? 和水果比起來(lái),Android就更加復(fù)雜了,它把屏幕分成small,normal,large,xlarge四種,其對(duì)應(yīng)的屏幕尺寸如下: xlarge 至少960dp x 720dp large 至少640dp x 480dp normal 至少470dp x 320dp small 至少426dp x 320dp dp(Density-independent pixel)是一個(gè)密度無(wú)關(guān)的像素單位,是用來(lái)表示基于160 dpi的設(shè)備計(jì)算出來(lái)的虛擬像素。 屏幕分辨率被分成low dpi,medium dpi,high dpi,extra high dpi。詳見(jiàn)下圖: 最近的Android設(shè)備屏幕分布圖: Android
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。