自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android屏幕適配

移動開發(fā) Android
Android開發(fā)中,Android屏幕適配是一件很棘手的事,需要注意的幾點(diǎn):盡量使用線性布局(LinearLayout)和相對布局(RelativeLayout),不要使用絕對布局;盡量使用dip和sp,不要使用px;為不同的分辨率提供不同的布局文件和圖片;在AndroidMainfest.xml中設(shè)置多分辨率支持。

對于從事android應(yīng)用開發(fā)的朋友來說都應(yīng)該知道,現(xiàn)在的安卓手機(jī)的屏幕類型十分繁多, 大小尺寸,長寬比例都不盡相同,同一個界面在不同分辨率的手機(jī)上可能出現(xiàn)布局錯亂,控件跑位的現(xiàn)象。做屏幕的適配偶們不可能實(shí)現(xiàn)在每種屏幕上顯示出的界面 效果完全一致。只能靠偶們平時的編程習(xí)慣和經(jīng)驗(yàn)是的界面在不同的屏幕尺寸在不會出現(xiàn)過分的走位,在可遇見范圍內(nèi)控制界面在不同屏幕下的變化,并做出相應(yīng)調(diào) 整。那么偶們應(yīng)該如何做到屏幕的適配呢?下面我就以我的開發(fā)經(jīng)驗(yàn)來說說吧。

1、首先從布局考慮

Android 的界面是由布局和組件協(xié)同完成的,布局好比是建筑里的框架,而組件則相當(dāng)于建筑里的磚瓦。組件按照布局的要求依次排列,就組成了用戶所看見的界面。 Android的五大布局分別是LinearLayout(線性布局)、FrameLayout(單幀布局)、RelativeLayout(相對布 局)、AbsoluteLayout(絕對布局)和TableLayout(表格布局)。

每種布局都有其特點(diǎn),你可能會郁悶無法掌握好每種布局的使用,其實(shí)不管一個界面多復(fù)雜,偶們只需上述的一兩種布局就可以實(shí)現(xiàn),android提供這么多的布局供偶們選擇只是為了方便偶們的開發(fā)。

本人習(xí)慣用LinearLayout,可能由于個人習(xí)慣,所以覺得線性布局的條理性更強(qiáng)一點(diǎn),LinearLayout布局的子控件有一個很重要的屬 性,android:layout_weight。該屬性將會在后面講到,在這里只是建議大家選擇一種自己比較熟悉的布局,自己的條理性強(qiáng)點(diǎn),在屏幕尺寸 發(fā)生變化時,能對子控件大小和位置的變化有一定的把握,這樣才能做好屏幕適配。 

2、px、dp和dip的關(guān)系

布局和子控件都有兩個重要屬性,layout_height和layout_width,用于指定控件的大小。系統(tǒng)還提供了幾個屬性供偶們使用, 

1)fill_parent 

設(shè)置一個構(gòu)件的布局為fill_parent將強(qiáng)制性地使構(gòu)件擴(kuò)展,以填充布局單元內(nèi)盡可能多的空間。這跟Windows控件的dockstyle屬性大體一致。設(shè)置一個頂部布局或控件為fill_parent將強(qiáng)制性讓它布滿整個屏幕。 

2) wrap_content 

設(shè)置一個視圖的尺寸為wrap_content將強(qiáng)制性地使視圖擴(kuò)展以顯示全部內(nèi)容。以TextView和ImageView控件為例,設(shè)置為 wrap_content將完整顯示其內(nèi)部的文本和圖像。布局元素將根據(jù)內(nèi)容更改大小。設(shè)置一個視圖的尺寸為wrap_content大體等同于設(shè)置 Windows控件的Autosize屬性為True。 

3)match_parent 

Android2.2中match_parent和fill_parent是一個意思 .兩個參數(shù)意思一樣,match_parent更貼切,于是從2.2開始兩個詞都可以用。那么如果考慮低版本的使用情況你就需要用fill_parent了。 

更多情況下,為了界面可以適應(yīng)不同屏幕分辨率的手機(jī),偶們需要限制控件的大小,這里就要用到px、dp、dip、sp等等,這里只簡單介紹下px和dip,其他在此不做闡述。 

px: pixels(像素),不同的設(shè)備不同的顯示屏顯示效果是相同的,是絕對像素,是多少就永遠(yuǎn)是多少不會改變。 顯然為了適配不同手機(jī)屏幕的顯示,使用px來指定控件的大小是不行。 

dip: device independent pixels(設(shè)備獨(dú)立像素). 不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這 這個不依賴像素。 

這里要特別注意dip與屏幕密度有關(guān),而屏幕密度又與具體的硬件有關(guān),硬件設(shè)置不正確,有可能導(dǎo)致dip不能正常顯示。在屏幕密度為160的顯示屏 上,1dip=1px,有時候可能你的屏幕分辨率很大如720*1280,但是屏幕密度沒有正確設(shè)置比如說還是160,那么這個時候凡是使用dip的都會 顯示異常,基本都是顯示過小。 

dip的換算:dip(value)=(int) (px(value)/1.5 + 0.5) 

dp: 很簡單,和dip是一樣的。 

所以在需要限定控件大小的時候,建議使用dip。 

3、屏幕的分類

1)以總像素?cái)?shù)分,文本的size等都要改,如下圖所示: 

clip_image001

每一個分類都有其最小分辨率,如下,可根據(jù)分辨率劃分種類: 

clip_image003

2)以屏幕密度分,提供不同的圖片,如下圖所示: 

clip_image004

Android 尋找最佳資源原理: 

1, 排除與設(shè)備設(shè)置不符合的資源 

2, 根據(jù)限定詞(qualifier)的優(yōu)先級,按照順序查找 

3, 在限定詞下,是否存在資源路徑 

4, 排除不包含在限定詞中的資源路徑 

5,  繼續(xù)執(zhí)行不同的限定詞查找,直到找到相應(yīng)的資源 

如下圖所示:(提供英文版和中文版) 

clip_image006

clip_image008

4、layout_weight屬性

這個屬性其實(shí)很好用,一般和android:layout_height="fill_parent"或 android:layout_width="fill_parent"一起使用,它用于描述該子元素在剩余空間中占有的大小比例。加入一行只有一個文本 框,那么它的默認(rèn)值就為0,如果一行中有兩個等長的文本框,那么他們的android:layout_weight值可以是同為1。如果一行中有兩個不等 長的文本框,那么他們的android:layout_weight值分別為1和2,那么第一個文本框?qū)⒄紦?jù)剩余空間的三分之二,第二個文本框?qū)⒄紦?jù)剩余 空間中的三分之一。android:layout_weight遵循數(shù)值越小,重要度越高的原則。android屏幕如此繁多,不可能都是等比例縮放的, 所以單純使用dip來設(shè)置控件也是行不通,與layout_weight屬性靈活結(jié)合使用,增強(qiáng)界面的適應(yīng)性。 

5、drawable資源

首先:你需要在AndroidManifest.xml文件的元素如下添加子元素 

 

  1. <supports-screens android:anyDensity="true"  android:largeScreens="true"  android:normalScreens="true"  android:smallScreens="true"  android:xlargeScreens="true" />   

名如其意,以上是為我們的屏幕設(shè)置多分辨率支持(更準(zhǔn)確的說是適配大、中、小三種密度)。android:anyDensity="true" ,這一句對 整個的屏幕都起著十分重要的作用,值為true,我們的應(yīng)用程序當(dāng)安裝在不同密度的手機(jī)上時,程序會分別加載hdpi,mdpi,ldpi文件夾中的資 源。相反,如果值設(shè)置為false,即使我們在hdpi,mdpi,ldpi文件夾下?lián)碛型环N資源,那么應(yīng)用也不會自動地去相應(yīng)文件夾下尋找資源,這種 情況都是出現(xiàn)在高密度,以及低密度的手機(jī)上,比如說一部240×320像素的手機(jī),如果設(shè)置 android:anyDensity="false",Android系統(tǒng)會將240 x 320(低密度)轉(zhuǎn)換為 320×480(中密度),這樣的 話,應(yīng)用就會在小密度手機(jī)上加載mdpi文件中的資源。
細(xì)心的人會發(fā)現(xiàn)自 android2.0開始之后drawable文件被三個文件夾drawable-hdpi,drawable-mdpi,drawable-ldpi三 個文件夾所取代,有些編程人員為了讓應(yīng)用程序默認(rèn)地加載某些圖片,他們會特意地去在android2.0之后的應(yīng)用程序中重新創(chuàng)建drawable文件 夾,其實(shí)這樣做完全沒有必要,通過第一段的分析我們得知,android:anyDensity="false",則應(yīng)用會將大小密度轉(zhuǎn)變成中密度,從而 去加載mdpi中的資源。這里同樣,當(dāng)android:anyDensity="false",則應(yīng)用會去加載mdpi中的資源。 

總結(jié)一下:

第一:android:anyDensity="true",系統(tǒng)會依據(jù)屏幕密度,自動去找對應(yīng)的文件夾

第二:android:anyDensity="false",

(1)如果drawable-hdpi,drawable-mdpi,drawable-ldpi三個文件夾中有同一張圖片資源的不同密度表示,那么系統(tǒng)會去加載

drawable_mdpi文件夾中的資源

(2)如果drawable-hpdi中有高密度圖片,其它兩個文件夾中沒有對應(yīng)圖片資源,那么系統(tǒng)會去加載drawable-hdpi中的資源。

(3)如果drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有對應(yīng)的圖片資源,那么系統(tǒng)會加載drawable-mdpi文件夾中的資源 

注意上圖各種文件夾的不同表示。

drawable-hdpi 該圖片即適用于橫屏,也適用于豎屏

drawable-land-hdpi,當(dāng)屏幕為橫屏,且為高密度時,加載此文件夾中的資源

drawable-port-hdpi,當(dāng)屏幕為豎屏,且為高密度時,加載此文件夾中的資源 

6、draw9patch工具

android SDK 包的tools目錄下為偶們提供了這么一個圖片處理工具。有時候偶們需要圖片資源自適應(yīng)且不失真,無論橫屏還是豎屏,高分辨率還是低分辨率,都能自動填充 滿,而且不失真等等背景問題。 Android針對這種情況,專門制作了一種.9.PNG格式來解決這個問題。draw9patch就是幫助偶們制 作.9.PNG格式資源的一個小工具。
*.9.PNG就標(biāo)準(zhǔn)的PNG格式,只是在最外面一 圈額外增加1px的邊框,這個1px的邊框就是用來定義圖片中可擴(kuò)展的和靜態(tài)不變的區(qū)域。特別說明,left(左)和top(上)邊框中交叉部分是可拉伸 部分,未選中部分是靜態(tài)區(qū)域部分。right和bottom(下和右)邊框中交叉部分則是內(nèi)容部分。

clip_image009

如上圖《也就是說,在手機(jī)里。無論上面那張圖怎么放大,四周的圓角都是不會被放大的!只有l(wèi)eft(左)和top(上)邊框內(nèi)才會伸縮!
在 Android中以9.PNG格式的圖片未背景,則能夠自定義拉伸而不失真,比如系統(tǒng)的Button就是一個典型的例子。其實(shí)呢,無論是left和 top,還是right和bottom都是把圖片分成9塊 (邊角四塊是不能縮放的,其他的四塊則是允許縮放的),所以叫做9.PNG。
關(guān)于draw9patch工具的使用在此不做闡述,需要的可以自己去百度一下。  

7、Layout資源

有時候可能由于屏幕布局過于復(fù)雜,同一個布局文件很難適應(yīng)所有的屏幕分辨率。可以像drawable資源一樣,在工程的res文件夾下建立多個相應(yīng)的layout文件夾,為相應(yīng)分辨率的屏幕編寫相應(yīng)的layout文件。 

文件夾的命名規(guī)范是這樣的:layout-分辨率
例如:layout-320x240 , layout-480x320等等。
系統(tǒng)就會根據(jù)運(yùn)行環(huán)境的分辨率優(yōu)先加載相應(yīng)的文件夾下的layout布局文件。 

8、代碼動態(tài)添加

使用過swing的都知道如何代碼動態(tài)添加控件,android也是一樣的,當(dāng)然代碼動態(tài)添加遠(yuǎn)遠(yuǎn)沒有xml布局文件方便,也不易于管理。但他的好處就是偶 們可以在代碼里獲得運(yùn)行環(huán)境的屏幕尺寸,通過計(jì)算構(gòu)建相應(yīng)的界面。雖然代碼編寫界面確實(shí)繁瑣,但他的適配性也是不可否認(rèn)的。
獲取屏幕的大小可以有兩種方法:
// 方法一:
WindowManager manager = getWindowManager();
int width = manager.getDefaultDisplay().getWidth();
int height = manager.getDefaultDisplay().getHeight();
// 方法二:
DisplayMetrics dMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dMetrics);
int screenWidth = dMetrics.widthPixels;
int screenHeight = dMetrics.heightPixels; 

然后就可以在代碼中為這幾種密度分別設(shè)置便宜量,但是這種方法最好不要使用,最好的方法是在xml文件中不同密度的手機(jī)進(jìn)行分別設(shè)置。 

這里地圖的偏移量可以在values-hpdi,calues-mdpi,calues-ldpi三種文件夾中的dimens.xml文件進(jìn)行設(shè)置。 

值得一提的是: 

<dimen name="bitmap_common_topoffset">40dp</dimen> 

<dimen name="bitmap_common_bottomoffset">-14dp</dimen> 

這里的負(fù)數(shù)是完全起作用的,系統(tǒng)會認(rèn)為它是一個負(fù)值。 

9、國家化問題

有時候在xml中設(shè)置了相應(yīng)的語言,但是為什么當(dāng)我們更改語言之后,UI顯示仍然不起作用? 不要懷疑是系統(tǒng)出了問題,這與我們在代碼中引用values/string.xml中字符串的方式有關(guān)。 

錯誤的方式: 

 1. 聲明全局變量 private static String tempStr; 

 2. 在onCreate方法中對該變量賦值 tempStr =context.getString(R.string.test); 

 3. 在更新UI的方法(非onCreate方法)中引用該變量。)textView.setText(tempStr); 

原因是由于,當(dāng)修改本地語言時,onCreate不會再被執(zhí)行一遍. 變量tempStr 依然會使用頁面剛啟動時加載的默認(rèn)英語。 

正確的方式:直接進(jìn)行第三步:textView.setText(context.getString(R.string.test)); 

10、其他

除了xml文件和代碼編寫界面外,還可以用webview加載相應(yīng)的html文件,界面內(nèi)容由html完成。本人見過別人用html5編寫界面也非常美觀,屏幕的適應(yīng)性也非常強(qiáng)。由于本人對html5不是很了解,在此就不細(xì)談,有興趣的朋友可以去了解下。
有時候可能由于屏幕實(shí)在太小,要顯示的內(nèi)容又實(shí)在太多,一屏實(shí)在擠不下去??梢赃m當(dāng)?shù)氖褂肧crollView控件使界面更加完整,確保用戶體驗(yàn)。 

如何將一個應(yīng)用程序適配在不同的手機(jī)上,雖然這不算是一個技術(shù)問題,但是對于剛剛做屏幕的開發(fā)人員來說,還真不是一件多么簡單的事情。
以上只是本人學(xué)習(xí)android開發(fā)以來的一點(diǎn)拙見和總結(jié),歡迎熱愛編程的朋友們一起來探討和學(xué)習(xí)! 

小結(jié): 

1、盡量使用線性布局(LinearLayout)和相對布局(RelativeLayout),不要使用絕對布局。

2、盡量使用dip和sp,不要使用px。

3、為不同的分辨率提供不同的布局文件和圖片。

4、在AndroidMainfest.xml中設(shè)置多分辨率支持。

怎么樣,現(xiàn)在是不是覺得很清晰明朗了????希望偶們就不要為屏幕適配而發(fā)愁啦!

Android資源屏幕適配官方文檔:http://developer.android.com/guide/practices/screens_support.html

責(zé)任編輯:閆佳明 來源: cnblogs
相關(guān)推薦

2015-11-02 09:49:04

Android屏幕適配官方指導(dǎo)

2017-11-10 13:02:44

iOSUI代碼

2015-02-05 14:31:45

iPhone適配

2016-12-02 20:43:28

Android

2012-02-13 16:39:03

AndroidWeb App官方文檔

2017-08-11 19:02:21

Android全屏幕適配

2016-11-30 18:19:22

REM

2018-05-04 15:26:10

Android開發(fā)全屏幕

2010-11-09 10:10:15

移動開發(fā)屏幕適配UI設(shè)計(jì)

2017-05-04 21:15:30

Android分辨率

2014-09-18 09:59:41

安卓郵箱適配屏幕

2013-03-28 13:27:14

Android獲取屏幕

2016-12-28 10:23:33

Android適配難題

2023-02-16 07:30:55

圖形編輯器屏幕開發(fā)

2013-04-22 10:27:47

2015-02-27 16:36:21

Android源碼屏幕畫筆Demo

2010-01-26 18:00:07

Android屏幕元素

2013-01-05 17:45:11

Android開發(fā)特效滾動屏幕

2010-01-27 15:29:25

Android屏幕大小
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號