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 一般多分辨率處理方法及其缺點
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
分辨率是指螢幕上擁有的像素的總數,通常使用“寬度×長度”表達。 雖然大部分情況下分辨率都被表示為“寬度×長度”,但分辨率并不意味着螢幕比 例。 (決定螢幕比例的是實體長度和實體寬度) ,通常,應用程式并不直接處理分辨率。
2.1.5 密度無關像素
密度無關像素dp: android 平台中虛拟的像素機關,定義成一種密度無關的形式,像素px 和dp 的轉換公式為 px =dp*(dpi/160)。在界面開發中應使用dp 作為像素機關,進而保證在不同的螢幕密度上控件所占的實際px 因密度而自動調整。
2.1.6 retina螢幕
retina螢幕是一種超高像素和越高密度的液晶屏。相對于以前的iphone ,iphone4 的螢幕增加了4倍的像素數量,它将960*640的分辨率壓縮到和前代iphone相同物 理尺寸(3.5英寸)的顯示屏内。
為了做到兩代iphone在顯示大小上看起來一緻,該螢幕的像素密度必須達到326像 素/英寸。更精密的顯示技術使人眼已難以分辨單個的像素,這使文字特别清晰, 畫質特别生動鮮活。
2.2 手機螢幕的分類
android 采用兩種标準對螢幕進行分類。按照螢幕尺寸分為四組small, normal, large, extra large;按照螢幕密度分為四組 low, medium ,high 和extra high,其分界線如圖1所示。
圖1 android 中的螢幕分類
為了優化程式ui,讓其适應多種分辨率并能清晰顯示,一般情況下需要為不同螢幕大小密度提供不同的圖檔檔案和對應的布局檔案,在運作的時候,android 系統會根據目前裝置的螢幕大小及密度等資訊,選擇加載其中一套比對的資源加以運作,進而達到适應多分辨率的效果。
2.3 設計
2.3.1 設計基準
結合種種因素 ,最終定義以中密度的正常螢幕(hvga )為設計基準。
hvga (half-size vga)即vga(640*480)的一半,分辨率為(480*320)。
它是用于各種各樣的pda裝置,首先是2002年的索尼clie peg - nr70 ,黑莓手機 谷歌手機也有hvga的,iphone也是hvga裝置。全球第一款google手機,t- mobile g1配備有3.2英寸hvga (320*480 )分辨率的全觌控式螢幕。
qvga 240*320像素
vga 640*480像素
wvga 800*480像素
hvga 480*320像素
2.3.2 ui設計
從開發角度講,應用程式會根據3類android手機螢幕提供3套ui布局檔案,但是相應界面圖示也需要提供3套,如下表所示:
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
status bar
24 x 24 px
32 x 32 px
tab
dialog
list view
2.4 android 支援多分辨率原理及步驟
由以上分析,預設的加載方式都不能很好地适應不同的分辨率,android 從1.6 開始支援多種分辨率的處理,原理簡而言之就是根據螢幕參數,動态加載資源檔案。在android 項目檔案結構中,drawable 檔案夾下包含三個子檔案夾,分别為drawable-hdpi, drawable-mdpi, drawable-ldpi, 分别存放hdpi,mdpi,ldip 的位圖。應用程式運作時,android 系統會根據目前裝置的螢幕大小、分辨率、螢幕密度、方向、長寬比等資訊,選擇相應檔案夾進行加載。android
配置修飾符的定義規則如下:
1)在res 檔案夾下建立目錄,命名為<resources_name>-<qualifier> 這種格式,其中<resources_name> 為标準資源名稱,例如drawable 或者layout;<qualifier> 即修飾符,指定對應的螢幕參數,比如normal/small/large,hdpi/mdpi/ldpi,land/port,long/notlong 等。
2)在步驟1 建立的檔案夾中存入相應的資源,比如位圖資源或者layout 資源,資源檔案的名字必須與預設資源檔案的名字相同。例如:
3)android 系統支援多分辨率的機制離不開android-manifest.xml 檔案的supports-screen 元素,若應用程式要适應多種分辨率,需要将anydensity 設定為true.
2.5 界面設計技巧
前面的部分已經詳細講解了如何架構應用程式使其更好地适應多種分辨率螢幕,此外,在界面設計和控制中我們還應該掌握一些原則或者技巧,進而使應用程式界面友好、适應性強。
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 平台的體系架構和分辨率相關的術語,詳細論述資源加載原理和多分辨率處理的詳細流程,最後給出了測試應用程式是否适應多種分辨率的方法。結合本人實踐經驗進行講述,内容深入淺出,較完整地論述了如何使應用程式盡可能多地适應多種分辨率螢幕。
參考資料:
android平台的多分辨率屏顯設計及其相容性測試
玩轉android多分辨率規格的界面設計.pdf
android手機分辨率基礎知識(dpi,dip計算)