建立不同畫面的資源
Android 本身會在許多不同的裝置上執行,每個裝置都有各種不同的解析度、螢幕大小和螢幕密度。 Android 會執行調整和重設大小,讓您的應用程式在這些裝置上運作,但這可能會導致次佳的用戶體驗。 例如,影像可能會呈現模糊,或影像可能如預期般放置在檢視上。
概念
若要支援多個畫面,請務必瞭解幾個詞彙和概念。
螢幕大小 – 顯示應用程式的實體空間量
螢幕密度 – 畫面上任何指定區域中的像素數目。 測量的一般單位是每英吋點數(dpi)。
解析度 – 畫面上的像素總數。 開發應用程式時,解析度不如螢幕大小和密度那麼重要。
與密度無關的圖元 (dp) – 一種虛擬測量單位,可讓版面配置與密度無關。 此公式用來將 dp 轉換成螢幕圖元:
px = dp × dpi ÷ 160
方向 – 螢幕的方向會被視為橫向時,其寬度大於高。 相反地,直向是螢幕高於寬度時。 當使用者輪替裝置時,應用程式存留期間的方向可能會變更。
請注意,這些概念的前三個是相互關聯的 – 增加解析度而不增加密度會增加螢幕大小。 不過,如果密度和解析度都增加,螢幕大小可以維持不變。 螢幕大小、密度和解析度之間的這種關聯性使螢幕支援快速複雜。
為了協助處理此複雜性,Android 架構偏好針對螢幕配置使用密度無關的圖元 (dp)。 藉由使用密度無關的圖元,UI 元素會顯示給使用者,在具有不同密度的螢幕上具有相同的實體大小。
支援各種螢幕大小和密度
Android 會處理大部分的工作,以針對每個螢幕設定正確轉譯配置。 不過,有一些動作可用來協助系統解決。
在大部分情況下,使用與密度無關的圖元,而不是版面配置中的實際圖元就已足夠,以確保密度獨立。 Android 會在運行時間將可繪製專案調整為適當的大小。 不過,縮放可能會使點陣圖看起來模糊。 若要解決此問題,請為不同的密度提供替代資源。 設計適用於多個解析度和螢幕密度的裝置時,會更容易從解析度或密度影像開始,然後相應減少。
宣告支援的螢幕大小
宣告螢幕大小可確保只有支援的裝置可以下載應用程式。 這可藉由在 AndroidManifest.xml 檔案中設定 supports-screens 元素來完成。 此元素可用來指定應用程式所支援的螢幕大小。 如果應用程式可以正確放置其版面配置以填滿畫面,則會被視為支援指定的畫面。 藉由使用此指令清單元素,應用程式將不會在Google Play中針對不符合螢幕規格的裝置顯示。 不過,應用程式仍會在具有不支援畫面的裝置上執行,但版面配置可能會呈現模糊和圖元化。
支援的畫面六項會在解決方案的 Properites/AndroidManifest.xml 檔案中宣告:
編輯 AndroidManifest.xml 以包含 支援畫面:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="HelloWorld.HelloWorld">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
<supports-screens android:resizable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true" />
<application android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
</application>
</manifest>
提供不同螢幕大小的替代版面配置
替代版面配置可讓您自定義指定螢幕大小的檢視、變更元件 UI 元素的位置或大小。
從 API 層級 13 (Android 3.2) 開始,螢幕大小會取代為使用 swNdp 限定符。 這個新的限定符會宣告指定配置需求的空間量。 建議在 Android 3.2 或更高版本上執行的應用程式應該使用這些較新的限定符。
例如,如果版面配置至少需要 700 dp 的螢幕寬度,替代版面配置會進入資料夾 layout-sw700dp:
作為指導方針,以下是各種裝置的一些數位:
一般電話 – 320 dp:一般電話
5 吋平板電腦 / “tweener” 裝置 – 480 dp:例如 Samsung Note
7 吋平板電腦 – 600 dp:例如巴恩斯和諾布爾努克
10 吋平板電腦 – 720 dp:例如摩托羅拉 Xoom
針對以 API 層級設定為最高 12 (Android 3.1) 的應用程式,版面配置應該會進入使用限定符的目錄中,而/小一般/大型/xlarge 是大部分裝置中可用之各種螢幕大小的一般化。 例如,在下圖中,有四個不同的螢幕大小替代資源:
以下是舊版 API 層級 13 螢幕大小限定符與密度無關像素的比較:
426 dp x 320 dp 是 小型
470 dp x 320 dp 是 正常的
640 dp x 480 dp 很大
960 dp x 720 dp 是 xlarge
API 層級 13 和更新版本中較新的螢幕大小限定符的優先順序高於 API 層級 12 和更低層級的較舊螢幕限定符。 對於將跨越舊版和新 API 層級的應用程式,可能需要使用這兩組限定符來建立替代資源,如下列螢幕快照所示:
為不同的螢幕密度提供不同的點陣圖
雖然 Android 會視需要調整裝置的點陣圖,但點陣圖本身可能不會優雅地相應增加或縮小:它們可能會變得模糊或模糊。 提供適合螢幕密度的點陣圖可減輕此問題。
例如,下圖是未提供密度指定資源時可能發生的配置和外觀問題範例。
將此與使用密度特定資源所設計的版面設定進行比較:
使用 Android Asset Studio 建立不同的密度資源
這些密度的位圖建立可能會有點乏味。 因此,Google 建立了一個在線公用程式,可減少與建立這些 稱為 Android Asset Studio 的點陣圖相關的一些 Tedium。
此網站將透過提供一個影像,協助建立以四個常見螢幕密度為目標的點陣圖。 Android Asset Studio 接著會建立具有一些自定義專案的點陣圖,然後允許它們下載為 zip 檔案。
多個畫面的秘訣
Android 在令人困惑的裝置數目上執行,螢幕大小和螢幕密度的組合似乎令人難以置身。 下列秘訣可協助將支援各種裝置所需的工作降到最低:
只有針對您需要 的裝置進行設計和開發 – 有許多不同的裝置存在,但有些裝置存在於罕見的規格中,可能會花費大量心力進行設計和開發。 螢幕大小 和 密度 儀表板是 Google 提供的頁面,可提供螢幕大小/螢幕密度矩陣的詳細資料。 此明細提供如何在支援畫面上進行開發工作的深入解析。
使用 DP 而不是像素 - 像素在螢幕密度變更時變得麻煩。 請勿硬式編碼圖元值。 避免使用 dp 的圖元(密度無關圖元)。
請盡可能避免 AbsoluteLayout – API 層級 3 (Android 1.5) 中已被取代,且會導致版面配置脆弱。 不應該使用它。 相反地,請嘗試使用更具彈性的配置小工具,例如 LinearLayout、RelativeLayout 或新的 GridLayout。
選擇一個版面配置方向作為您的預設值 – 例如,不要提供替代資源配置-土地和版面配置埠、將橫向的資源放在版面配置中,並將直向的資源放入版面配置埠。
使用 Height 和 Width 的 LayoutParams - 在 XML 版面設定檔中定義 UI 元素時,使用 wrap_content 和 fill_parent 值的 Android 應用程式將能比使用圖元或密度無關的單位,在不同的裝置上正確查看。 這些維度值會導致Android適當地調整位圖資源。 因此,在指定UI元素的邊界和邊框間距時,最好保留密度無關的單位。
測試多個畫面
Android 應用程式必須針對支援的所有組態進行測試。 在理想情況下,裝置應該在實際裝置本身上進行測試,但在許多情況下,這是不可能或實用的。 在此情況下,針對每個裝置組態使用模擬器和 Android 虛擬設備設定會很有用。
Android SDK 提供一些模擬器面板可用來建立 AVD,將會復寫許多裝置的大小、密度和解析度。 許多硬體廠商同樣會為其裝置提供面板。
另一個選項是使用第三方測試服務的服務。 這些服務會採用 APK、在許多不同的裝置上執行,然後提供應用程式運作方式的意見反應。