Android開發中,Android屏幕適配是一件很棘手的事,須要注意的幾點:
儘可能使用線性佈局(LinearLayout)和相對佈局(RelativeLayout),
不要使用絕對佈局;儘可能使用dip和sp,不要使用px;爲不一樣的分辨率提供不一樣的佈局文件和圖片;在AndroidMainfest.xml中設置多分辨率支持。
對於從事android應用開發的朋友來講都應該知道,如今的安卓手機的屏幕類型十分繁多, 大小尺寸,長寬比例都不盡相同,同一個界面在不一樣分辨率的手機上可能出現佈局錯亂,控件跑位的現象。作屏幕的適配偶們不可能實如今每種屏幕上顯示出的界面 效果徹底一致。只能靠偶們平時的編程習慣和經驗是的界面在不一樣的屏幕尺寸在不會出現過度的走位,在可碰見範圍內控制界面在不一樣屏幕下的變化,並作出相應調 整。那麼偶們應該如何作到屏幕的適配呢?下面我就以個人開發經驗來講說吧。html
Android 的界面是由佈局和組件協同完成的,佈局比如是建築裏的框架,而組件則至關於建築裏的磚瓦。組件按照佈局的要求依次排列,就組成了用戶所看見的界面。 Android的五大布局分別是LinearLayout(線性佈局)、FrameLayout(單幀佈局)、RelativeLayout(相對布 局)、AbsoluteLayout(絕對佈局)和TableLayout(表格佈局)。html5
每種佈局都有其特色,你可能會鬱悶沒法掌握好每種佈局的使用,其實無論一個界面多複雜,偶們只需上述的一兩種佈局就能夠實現,android提供這麼多的佈局供偶們選擇只是爲了方便偶們的開發。android
本人習慣用LinearLayout,可能因爲我的習慣,因此以爲線性佈局的條理性更強一點,LinearLayout佈局的子控件有一個很重要的屬 性,android:layout_weight。該屬性將會在後面講到,在這裏只是建議你們選擇一種本身比較熟悉的佈局,本身的條理性強點,在屏幕尺寸 發生變化時,能對子控件大小和位置的變化有必定的把握,這樣才能作好屏幕適配。 web
佈局和子控件都有兩個重要屬性,layout_height和layout_width,用於指定控件的大小。系統還提供了幾個屬性供偶們使用, 編程
1)fill_parent 框架
設置一個構件的佈局爲fill_parent將強制性地使構件擴展,以填充佈局單元內儘量多的空間。這跟Windows控件的dockstyle屬性大致一致。設置一個頂部佈局或控件爲fill_parent將強制性讓它佈滿整個屏幕。 工具
2) wrap_content 佈局
設置一個視圖的尺寸爲wrap_content將強制性地使視圖擴展以顯示所有內容。以TextView和ImageView控件爲例,設置爲 wrap_content將完整顯示其內部的文本和圖像。佈局元素將根據內容更改大小。設置一個視圖的尺寸爲wrap_content大致等同於設置 Windows控件的Autosize屬性爲True。 學習
3)match_parent spa
Android2.2中match_parent和fill_parent是一個意思 .兩個參數意思同樣,match_parent更貼切,因而從2.2開始兩個詞均可以用。那麼若是考慮低版本的使用狀況你就須要用fill_parent了。
更多狀況下,爲了界面能夠適應不一樣屏幕分辨率的手機,偶們須要限制控件的大小,這裏就要用到px、dp、dip、sp等等,這裏只簡單介紹下px和dip,其餘在此不作闡述。
px: pixels(像素),不一樣的設備不一樣的顯示屏顯示效果是相同的,是絕對像素,是多少就永遠是多少不會改變。 顯然爲了適配不一樣手機屏幕的顯示,使用px來指定控件的大小是不行。
dip: device independent pixels(設備獨立像素). 不一樣設備有不一樣的顯示效果,這個和設備硬件有關,通常咱們爲了支持WVGA、HVGA和QVGA 推薦使用這 這個不依賴像素。
這裏要特別注意dip與屏幕密度有關,而屏幕密度又與具體的硬件有關,硬件設置不正確,有可能致使dip不能正常顯示。在屏幕密度爲160的顯示屏 上,1dip=1px,有時候可能你的屏幕分辨率很大如720*1280,可是屏幕密度沒有正確設置好比說仍是160,那麼這個時候凡是使用dip的都會 顯示異常,基本都是顯示太小。
dip的換算:dip(value)=(int) (px(value)/1.5 + 0.5)
dp: 很簡單,和dip是同樣的。
因此在須要限定控件大小的時候,建議使用dip。
1)以總像素數分,文本的size等都要改,以下圖所示:
每個分類都有其最小分辨率,以下,可根據分辨率劃分種類:
2)以屏幕密度分,提供不一樣的圖片,以下圖所示:
Android 尋找最佳資源原理:
1, 排除與設備設置不符合的資源
2, 根據限定詞(qualifier)的優先級,按照順序查找
3, 在限定詞下,是否存在資源路徑
4, 排除不包含在限定詞中的資源路徑
5, 繼續執行不一樣的限定詞查找,直到找到相應的資源
以下圖所示:(提供英文版和中文版)
這個屬性其實很好用,通常和android:layout_height="fill_parent"或 android:layout_width="fill_parent"一塊兒使用,它用於描述該子元素在剩餘空間中佔有的大小比例。加入一行只有一個文本 框,那麼它的默認值就爲0,若是一行中有兩個等長的文本框,那麼他們的android:layout_weight值能夠是同爲1。若是一行中有兩個不等 長的文本框,那麼他們的android:layout_weight值分別爲1和2,那麼第一個文本框將佔據剩餘空間的三分之二,第二個文本框將佔據剩餘 空間中的三分之一。android:layout_weight遵循數值越小,重要度越高的原則。android屏幕如此繁多,不可能都是等比例縮放的, 因此單純使用dip來設置控件也是行不通,與layout_weight屬性靈活結合使用,加強界面的適應性。
首先:你須要在AndroidManifest.xml文件的元素以下添加子元素
名如其意,以上是爲咱們的屏幕設置多分辨率支持(更準確的說是適配大、中、小三種密度)。android:anyDensity="true" ,這一句對 整個的屏幕都起着十分重要的做用,值爲true,咱們的應用程序當安裝在不一樣密度的手機上時,程序會分別加載hdpi,mdpi,ldpi文件夾中的資 源。相反,若是值設置爲false,即便咱們在hdpi,mdpi,ldpi文件夾下擁有同一種資源,那麼應用也不會自動地去相應文件夾下尋找資源,這種 狀況都是出如今高密度,以及低密度的手機上,好比說一部240×320像素的手機,若是設置 android:anyDensity="false",Android系統會將240 x 320(低密度)轉換爲 320×480(中密度),這樣的 話,應用就會在小密度手機上加載mdpi文件中的資源。
細心的人會發現自 android2.0開始以後drawable文件被三個文件夾drawable-hdpi,drawable-mdpi,drawable-ldpi三 個文件夾所取代,有些編程人員爲了讓應用程序默認地加載某些圖片,他們會特地地去在android2.0以後的應用程序中從新建立drawable文件 夾,其實這樣作徹底沒有必要,經過第一段的分析咱們得知,android:anyDensity="false",則應用會將大小密度轉變成中密度,從而 去加載mdpi中的資源。這裏一樣,當android:anyDensity="false",則應用會去加載mdpi中的資源。
第一:android:anyDensity="true",系統會依據屏幕密度,自動去找對應的文件夾
第二:android:anyDensity="false",
(1)若是drawable-hdpi,drawable-mdpi,drawable-ldpi三個文件夾中有同一張圖片資源的不一樣密度表示,那麼系統會去加載
drawable_mdpi文件夾中的資源
(2)若是drawable-hpdi中有高密度圖片,其它兩個文件夾中沒有對應圖片資源,那麼系統會去加載drawable-hdpi中的資源。
(3)若是drawable-hdpi,drawable-mdpi中有圖片資源,drawable-ldpi中沒有對應的圖片資源,那麼系統會加載drawable-mdpi文件夾中的資源
注意上圖各類文件夾的不一樣表示。
drawable-hdpi 該圖片即適用於橫屏,也適用於豎屏
drawable-land-hdpi,當屏幕爲橫屏,且爲高密度時,加載此文件夾中的資源
drawable-port-hdpi,當屏幕爲豎屏,且爲高密度時,加載此文件夾中的資源
android SDK 包的tools目錄下爲偶們提供了這麼一個圖片處理工具。有時候偶們須要圖片資源自適應且不失真,不管橫屏仍是豎屏,高分辨率仍是低分辨率,都能自動填充 滿,並且不失真等等背景問題。 Android針對這種狀況,專門製做了一種.9.PNG格式來解決這個問題。draw9patch就是幫助偶們制 做.9.PNG格式資源的一個小工具。
*.9.PNG就標準的PNG格式,只是在最外面一 圈額外增長1px的邊框,這個1px的邊框就是用來定義圖片中可擴展的和靜態不變的區域。特別說明,left(左)和top(上)邊框中交叉部分是可拉伸 部分,未選中部分是靜態區域部分。right和bottom(下和右)邊框中交叉部分則是內容部分。
如上圖《也就是說,在手機裏。不管上面那張圖怎麼放大,四周的圓角都是不會被放大的!只有left(左)和top(上)邊框內纔會伸縮!
在 Android中以9.PNG格式的圖片未背景,則可以自定義拉伸而不失真,好比系統的Button就是一個典型的例子。其實呢,不管是left和 top,仍是right和bottom都是把圖片分紅9塊 (邊角四塊是不能縮放的,其餘的四塊則是容許縮放的),因此叫作9.PNG。
關於draw9patch工具的使用在此不作闡述,須要的能夠本身去百度一下。
有時候可能因爲屏幕布局過於複雜,同一個佈局文件很難適應全部的屏幕分辨率。能夠像drawable資源同樣,在工程的res文件夾下創建多個相應的layout文件夾,爲相應分辨率的屏幕編寫相應的layout文件。
文件夾的命名規範是這樣的:layout-分辨率
例如:layout-320x240 , layout-480x320等等。
系統就會根據運行環境的分辨率優先加載相應的文件夾下的layout佈局文件。
使用過swing的都知道如何代碼動態添加控件,android也是同樣的,固然代碼動態添加遠遠沒有xml佈局文件方便,也不易於管理。但他的好處就是偶 們能夠在代碼裏得到運行環境的屏幕尺寸,經過計算構建相應的界面。雖然代碼編寫界面確實繁瑣,但他的適配性也是不能否認的。
獲取屏幕的大小能夠有兩種方法:
// 方法一:
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;
而後就能夠在代碼中爲這幾種密度分別設置便宜量,可是這種方法最好不要使用,最好的方法是在xml文件中不一樣密度的手機進行分別設置。
這裏地圖的偏移量能夠在values-hpdi,calues-mdpi,calues-ldpi三種文件夾中的dimens.xml文件進行設置。
值得一提的是:
<dimen name="bitmap_common_topoffset">40dp</dimen>
<dimen name="bitmap_common_bottomoffset">-14dp</dimen>
這裏的負數是徹底起做用的,系統會認爲它是一個負值。
有時候在xml中設置了相應的語言,可是爲何當咱們更改語言以後,UI顯示仍然不起做用? 不要懷疑是系統出了問題,這與咱們在代碼中引用values/string.xml中字符串的方式有關。
錯誤的方式:
1. 聲明全局變量 private static String tempStr;
2. 在onCreate方法中對該變量賦值 tempStr =context.getString(R.string.test);
3. 在更新UI的方法(非onCreate方法)中引用該變量。)textView.setText(tempStr);
緣由是因爲,當修改本地語言時,onCreate不會再被執行一遍. 變量tempStr 依然會使用頁面剛啓動時加載的默認英語。
正確的方式:直接進行第三步:textView.setText(context.getString(R.string.test));
除了xml文件和代碼編寫界面外,還能夠用webview加載相應的html文件,界面內容由html完成。本人見過別人用html5編寫界面也很是美觀,屏幕的適應性也很是強。因爲本人對html5不是很瞭解,在此就不細談,有興趣的朋友能夠去了解下。
有時候可能因爲屏幕實在過小,要顯示的內容又實在太多,一屏實在擠不下去。能夠適當的使用ScrollView控件使界面更加完整,確保用戶體驗。
如何將一個應用程序適配在不一樣的手機上,雖然這不算是一個技術問題,可是對於剛剛作屏幕的開發人員來講,還真不是一件多麼簡單的事情。
以上只是本人學習android開發以來的一點拙見和總結,歡迎熱愛編程的朋友們一塊兒來探討和學習!
一、儘可能使用線性佈局(LinearLayout)和相對佈局(RelativeLayout),不要使用絕對佈局。
二、儘可能使用dip和sp,不要使用px。
三、爲不一樣的分辨率提供不一樣的佈局文件和圖片。
四、在AndroidMainfest.xml中設置多分辨率支持。