摘要:近年來,智能手機的功能愈來愈強大,移動終端應用程序層出不窮,移動互聯網改變人們的生活。Android系統是開放手機聯盟推出的一款開源的手機操做系統,正是因爲其開放性,沒有采用Windows Phone7相似的硬件限定標準,目前基於Android系統的機型愈來愈多,一些硬件指標出現了混亂的局面,其中最明顯的就是屏幕分辨率的問題。如何使開發者的應用程序儘量多地適應多種分辨率,正是本文要講述的問題。文章首先介紹Android的系統架構,而後介紹Android平臺中分辨率的相關術語,以後重點講述在開發過程當中如何部署資源以及所應遵循的原則,最後給出測試多分辨率兼容性的方法。 java
0 引 言 架構
2007 年11 月,Google 公司發佈基於Linux2.6 內核的移動終端操做系統- Android, 因爲其開源性, 獲得不少手機廠商的追捧和應用開發者的青睞。近年來智能手機發展迅速,運行速度、存儲容量和可靠性等指標有了顯着提升[1],當今的智能手機用戶對應用軟件的溫馨性和美觀性有了更大的指望,應用程序界面友好性已經愈來愈重要。可是因爲Android 的開源性,硬件廠商屏幕分辨率不統一,據統計目前市場上Android系統手機的分辨率有10 餘種,分辨率分佈如此普遍使得開發者在處理多分辨率適應方面遇到了很多難題。文章首先介紹Android 平臺的系統架構及資源管理方法,以後介紹目前開發者在處理多分辨率時採用的方法,然後重點分析Android 平臺資源加載機制而且結合實例給出多分辨率的處理步驟及技巧,最後介紹測試多分辨率效果的方法。 框架
1 Android 平臺簡介Android 是一個包括操做系統、中間件和關鍵應用的移動設備軟件堆[2],Android 系統和其餘系統同樣,採用分層的架構。由下至上依此爲Linux 操做系統和驅動、程序庫及Android 運行時環境、應用程序框架層、應用層。 Android 應用程序的基本組件有Activity、Intent、BroadcaSTReceiver、Service 四種,各個組件的配置信息以及權限管理、版本管理等配置信息都保存在AndroidManifest.xml 中。 佈局
1.1 Android 應用程序資源管理 測試
手機界面上加載的圖片是Android 資源的一種,除此以外還有XML 資源(anim.xml layout.xml 等) 以及原數據文件( 音視頻文件等)[3].新建一個HelloAndroid 的Android 應用程序,默認生成的文件架構包含src,gen,assets,res 等文件夾,以及AndroidManifest.xml 配置文件。src 文件夾中保存的是Android 源代碼,res 文件夾表明應用程序須要使用到的資源文件,gen 包中包含R.java 文件。Res 文件夾中包含的全部資源文件都對應在R.java 中。 優化
當開發者在res/ 目錄中任何一個子目錄中添加相應類型的文件以後,ADT 會在R.java 文件中相應的匿名內部類中國自動生成一條靜態int 類型的常量,對添加的文件進行索引。 編碼
Android 系統採起這種架構使視圖等資源文件與控制代碼分離,實現鬆耦合。然而可使用R.java 文件在代碼中對相應的資源文件進行存取,靈活操做。 操作系統
1.2 通常多分辨率處理方法及其缺點 .net
1.2.1 圖片縮放 設計
基於當前屏幕的精度,平臺自動加載任何未經縮放的限定尺寸和精度的圖片。若是圖片不匹配,平臺會加載默認資源而且在放大或者縮小以後能夠知足當前界面的顯示要求。例如,當前爲高精度屏幕,平臺會加載高精度資源(如HelloAndroid中drawable-hdpi 中的位圖資源),若是沒有,平臺會將中精度資源縮放至高精度,致使圖片顯示不清晰。
1.2.2 自動定義像素尺寸和位置
若是程序不支持多種精度屏幕,平臺會自動定義像素絕對位置和尺寸值等,這樣就能保證元素能和精度160 的屏幕上同樣能顯示出一樣尺寸的效果。例如,要讓WVGA 高精度屏幕和傳統的HVGA 屏幕同樣顯示一樣尺寸的圖片,當程序不支持時,系統會對程序慌稱屏幕分辨率爲320×480,在(10,10)到(100,100)的區域內繪製圖形完成以後,系統會將圖形放大到(15,15)到(150,150)的屏幕顯示區域。
1.2.3 兼容更大尺寸的屏幕
當前屏幕超過程序所支持屏幕的上限時,定義supportsscreens元素,這樣超出顯示的基準線時,平臺在此顯示黑色的背景圖。例如,WVGA 中精度屏幕上,如程序不支持這樣的大屏幕,系統會謊稱是一個320×480 的,多餘的顯示區域會被填充成黑色。
1.2.4 採用OpenGL 動態繪製圖片
Android 底層提供了OpenGL 的接口和方法,能夠動態繪製圖片,可是這種方式對不熟悉計算機圖形學的開發者來說是一個很大的挑戰。通常開發遊戲,採用OpenGL 方式。
1.2.5 多個apk 文件
Symbian 和傳統的J2ME 就是採用這種方式,爲一款應用提供多個分辨率版本,用戶根據本身的需求下載安裝相應的可執行文件。針對每一種屏幕單獨開發應用程序不失爲一種好方法,可是目前Google Market 對一個應用程序多個分辨率版本的支持還不完善,開發者仍是須要儘量使用一個apk 文件適應多個分辨率。
2 多分辨率處理方案詳解
2.1 基本術語介紹
2.1.1 屏幕尺寸
真正的物理尺寸,屏幕對角線的長度,單位是英寸。爲了簡化起見,Android 把支持的全部物理尺寸分紅了4 組:small,normal, large, extra large.
2.1.2 屏幕密度Density
必定物理範圍的像素的個數,單位一般是dpi(dots perinch), 即每英寸的點數。例如一個低分辨率屏幕相對於高分辨率屏幕在必定的物理區域內包含的像素點要少。爲了簡化起見,Android 將全部的屏幕密度分紅四組:low, medium,high 和extra high.
2.1.3 方向Orientation
從用戶視角來看的屏幕的方向,Portrait 縱向和Landscape 橫向。
2.1.4 分辨率Resolution
屏幕上全部的像素點數目,通常用480*800 的形式來表示。密度無關像素dp: Android 平臺中虛擬的像素單位,定義成一種密度無關的形式,像素px 和dp 的轉換公式爲 px =dp*(dpi/160)。在界面開發中應使用dp 做爲像素單位,從而保證在不一樣的屏幕密度上控件所佔的實際px 因密度而自動調整。
2.2 手機屏幕的分類
Android 採用兩種標準對屏幕進行分類。按照屏幕尺寸分爲四組small, normal, large, extra large;按照屏幕密度分爲四組 low, medium ,high 和extra high,其分界線如圖1所示。
圖1 Android 中的屏幕分類
爲了優化程序UI,讓其適應多種分辨率並能清晰顯示,通常狀況下須要爲不一樣屏幕大小密度提供不一樣的圖片文件和對應的佈局文件,在運行的時候,Android 系統會根據當前設備的屏幕大小及密度等信息,選擇加載其中一套匹配的資源加以運行,從而達到適應多分辨率的效果。
2.3 Android 支持多分辨率原理及步驟
由以上分析,默認的加載方式都不能很好地適應不一樣的分辨率,Android 從1.6 開始支持多種分辨率的處理,原理簡而言之就是根據屏幕參數,動態加載資源文件。在Android 項目文件結構中,drawable 文件夾下包含三個子文件夾,分別爲drawable-hdpi, drawable-mdpi, drawable-ldpi, 分別存放hdpi,mdpi,ldip 的位圖。應用程序運行時,Android 系統會根據當前設備的屏幕大小、分辨率、屏幕密度、方向、長寬比等信息,選擇相應文件夾進行加載。Android 配置修飾符的定義規則以下:
1)在res 文件夾下新建目錄,命名爲-這種格式,其中爲標準資源名稱,例如drawable 或者layout;即修飾符,指定對應的屏幕參數,好比normal/small/large,hdpi/mdpi/ldpi,land/port,long/notlong 等。
2)在步驟1 新建的文件夾中存入相應的資源,好比位圖資源或者layout 資源,資源文件的名字必須與默認資源文件的名字相同。例如:
3)Android 系統支持多分辨率的機制離不開Android-Manifest.xml 文件的supports-screen 元素,若應用程序要適應多種分辨率,須要將anyDensity 設置爲true.
2.4 界面設計技巧
前面的部分已經詳細講解了如何架構應用程序使其更好地適應多種分辨率屏幕,此外,在界面設計和控制中咱們還應該掌握一些原則或者技巧,從而使應用程序界面友好、適應性強。
1)在XML layout 文件中定義長度的時候,最好使用wrap_content,fill_parent, 或者dp 進行描述,這樣能夠保證在屏幕上面展現的時候有合適的大小。例如,一個view layout_width="100dip",在 HVGA@160 density 的設備上顯示100 個px,而在 WVGA@240 density 的設備上顯示150 個px,可是所佔的物理尺寸時相同的。
2)在Activity 或者其餘控制視圖加載的代碼處,不要使用像素單位的硬編碼。
3)不要使用AbsoluteLayout.絕對佈局是由AndroidUI toolkit 提供的佈局容器中的一種。可是與其餘layout 不同的是,AbsoluteLayout 使用固定的位置表示,使得在不一樣的屏幕上面顯示效果很差,所以AbsoluteLayout 在sdk1.6 及之後的版本中被棄用了。
4)爲不一樣屏幕密度的手機,提供不一樣的位圖資源,可使得界面清晰無縮放。
3 多分辨率兼容性測試方案在產品發行以前,要在全部的目標手機上進行全面的測試。Android SDK 包含了一套測試多分辨率的機制。能夠本身定製avd 做爲應用程序的測試環境,avd 會模擬真實機器的屏幕大小和密度。例如圖2 爲模擬器的列表,能夠將程序運行在這四個模擬器中進行多分辨率的測試。
圖2 虛擬機列表
4 結論
本文介紹Android 平臺的體系架構和分辨率相關的術語,詳細論述資源加載原理和多分辨率處理的詳細流程,最後給出了測試應用程序是否適應多種分辨率的方法。結合本人實踐經驗進行講述,內容深刻淺出,較完整地論述瞭如何使應用程序儘量多地適應多種分辨率屏幕。