標籤:
郭孝星
微博:郭孝星的新浪微博
郵箱:[email protected]
部落格:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell
由於Android平台的豐富性和多樣性,全世界的Android裝置有著各種各樣的尺寸和大小,而為了能夠推廣我們的應用給各種各樣的使用者,裝置適配是一件很重要的工作。
一 語言適配
把UI中的字串儲存在外部檔案,通過代碼提取,這是一種很好的做法。Android可以通過工程中的資來源目錄輕鬆實現這一功能。
為了支援多國語言,在res/中建立一個額外的values目錄以連字號和ISO國家代碼結尾命名,比如values-es/是為語言代碼為”es”的地區設定的簡單的資源檔的目錄。Android會在運行時根據裝置的地區設定,載入相應的資源
若你決定支援某種語言,則需要建立資源子目錄和字串資源檔,如所示:
添加不同地區語言的字串值到相應的檔案,在運行時,Android系統會根據使用者裝置當前的地區設定,使用相應的字串資源。
舉例
下面列舉了幾個不同語言對應不同的字串資源檔:
英語(預設區域語言,/values/strings.xml)
<?xml version="1.0" encoding="utf-8"?><resources> <string name="title">My Application</string> <string name="hello_world">Hello World!</string></resources>
西班牙語(/values-es/strings.xml)
<?xml version="1.0" encoding="utf-8"?><resources> <string name="title">Mi Aplicación</string> <string name="hello_world">Hola Mundo!</string></resources>
法語(/values-fr/strings.xml)
<?xml version="1.0" encoding="utf-8"?><resources> <string name="title">Mon Application</string> <string name="hello_world">Bonjour le monde !</string></resources>
二 螢幕適配
Android將裝置螢幕歸類為兩種常規屬性:尺寸和解析度。你應該想到你的App會被安裝在各種螢幕尺寸和解析度的裝置中。這樣,你的App就應該包含一些可選資源,針對不同的螢幕尺寸和解析度,來最佳化你的App外觀。
一般說來,有4種普遍尺寸:
- 小(small)
- 普通(normal)
- 大(large)
- 超大(xlarge)
以及4種解析度
- 低精度(ldpi)
- 中精度(mdpi)
- 高精度(hdpi)
- 超高精度(xhdpi)
聲明針對不同螢幕所用的layout和bitmap,把這些可選資源放置在獨立的目錄中,與適配不同語言時的做法類似。同樣要注意螢幕的方向(橫向或縱向)也是一種需要考慮的螢幕尺寸變化,所以許多App會修改layout,來針對不同的螢幕方向最佳化使用者體驗。
2.1 建立不同的layout
為了針對不同的螢幕去最佳化使用者體驗,你需要對每一種將要支援的螢幕尺寸,建立唯一的XML檔案。每一種layout需要儲存在相應的資來源目錄中,目錄以- 為尾碼命名。例如,對大尺寸螢幕(large screens),一個唯一的layout檔案應該儲存在 res/layout-large/ 中。為了匹配合適的螢幕尺寸Android會自動地測量你的layout檔案。所以你不需要因不同的螢幕尺寸去擔心UI元素的大小,而應該專註於layout結構對使用者體驗的影響,比如關鍵視圖相對於同級視圖的尺寸或位置。
Android Studio在處理這種布局檔案的尺寸和方向變化時也是非常智能的,你只需要簡單的建立layout-land、layout-large這些目錄即可,如下所示:
2.2 建立不用的bitmap
我們應該為4種普遍解析度:低,中,高,超高精度,都提供相適配的bitmap資源。以便在所有螢幕解析度中都能有良好的畫質和效果。
要產生這些映像,需要從原始的向量映像資源著手,然後根據下列尺寸比例,產生各種密度下的映像。
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (基準)
- ldpi: 0.75
也就是說,如果你針對xhdpi的裝置產生了一張200x200的映像,同樣的你應該為hdpi產生150x150,為mdpi產生100x100, 和為ldpi產生75x75的圖片資源。
任何時候,當你引用 @drawable/awesomeimage 時系統會根據螢幕的解析度選擇恰當的bitmap。另外,低密度(ldpi)資源是非必要的,當你提供了hdpi的映像,系統會把hdpi的映像按比例縮小一半,去適配ldpi的螢幕。
三 系統適配
新的Android版本會為你的app提供更棒的APIs,但你的app仍應該支援舊版本的Android,直到更多的裝置升級到新版本為止。
Platform Versions的控制台會定時更新,通過統計訪問Google Play Store的裝置數量,來顯示運行每個版本的安卓裝置的分布。一般情況下,在更新你的app至最新Android版本時,最好先保證你的新版app可以支援90%的裝置使用。
為了能在幾個Android版本中都能提供最好的特性和功能,我們應該在App中使用Android Support Library,它能使你的App能在舊平台上使用最近的幾個平台的APIs。
3.1 指定最小和目標API層級
AndroidManifest.xml檔案中描述了你的App的細節,並且標明App支援哪些Android版本。具體來說,元素中
- minSdkVersion:最低相容API的層級
- targetSdkVersion:最高適用的API層級(這個最
高的層級是需要通過你的測試的)
隨著新版本Android的發布,一些風格和行為可能會改變,為了能使你的app能利用這些變化,而且能適配不同風格的使用者的裝置,我們應該設定targetSdkVersion的值去匹配最新的可用Android版本。
如下所示:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.allenwells.myapplication" > <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" /></manifest>
3.2 在運行時檢查系統版本
Android在Build常量類中提供了對每一個版本的唯一代號,在你的app中使用這些代號可以建立條件,保證依賴於進階別的API的代碼,只會在這些API在當前系統中可用時才會執行,如下所示:
private void setUpActionBar() { // Make sure we‘re running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); }}
另外,當解析XML資源時,Android會忽略當前裝置不支援的XML屬性。所以你可以安全地使用較新版本的XML屬性,而不需要擔心舊版本Android遇到這些代碼時會崩潰。例如如果你設定 targetSdkVersion=”11” ,你的App會在Android 3.0或更高時預設包含ActionBar。然後添加menu items到action bar時,你需要在你的menu XML資源中設定:
android:showAsAction="ifRoom"
在跨版本的XML檔案中這麼做是安全的,因為舊版本的Android會簡單地忽略showAsAction屬性,你並不需要用到res/menu-v11/ 中單獨版本的檔案。
3.3 使用平颱風格和主題
Android提供了使用者體驗主題,為App提供基礎作業系統的外觀和體驗。這些主題可以在manifest檔案中被應用於你的App中.通過使用內建的風格和主題,App會自然地隨著Android新版本的發布,自動適配最新的外觀和體驗.
使activity看起來像對話方塊
<activity android:theme="@android:style/Theme.Dialog">
使activity有一個透明背景
<activity android:theme="@android:style/Theme.Translucent">
應用在/res/values/styles.xml 中定義的自訂佈景主題:
<activity android:theme="@style/CustomTheme">
使整個App應用一個主題(全部activities)在元素中添加android:theme屬性
<application android:theme="@style/CustomTheme">
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【Android應用開發技術:使用者介面】裝置適配