全世界安卓智能手機語言不相同,因爲各廠家生產出的系統、屏幕也各異,隨着SDK不斷更新不一樣版本也有區別,android適配技能日益成爲必不可少的一項專業技能。根據網上的資料和我的經驗總結,整理一份目前比較完整的適配大全,有疏漏之處還望指正。android
當用戶在智能手機系統「設置」選項中更改了各國語言,這時咱們須要在項目裏經過資源目錄實現適配語言。bash
咱們知道工程的根目錄有個res/的目錄,res/下有一個資源類型的目錄,其中有個values/strings.xml默認文件,在res/目錄下建立多個values/strings.xml文件,可是values目錄須要更名,例如:app
res/
values/
strings.xml
values-es/
strings.xml
values-fr/
strings.xml
複製代碼
其中,英語,/values/strings.xml:ide
<?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>
複製代碼
而後,咱們就能夠在代碼中使用R.string.<string_name>語法來引用字符串資源就好了。優化
Android是用尺寸和分辨率這兩種常規屬性對設備加以分類。在咱們開發項目中應該提供一些可選資源,針對尺寸和分別率來優化咱們的界面外觀。ui
首先,說一說這個分別率的問題。this
在項目開發的過程當中有一個重要的合做是與UI設計師的圖片大小分別率的溝通。例如,UI設計師實現步驟:①在coreldraw或者Sketch中製做好「矢量圖標「 ;②保存輸出爲「PNG位圖圖片」,單位是px;③設置圖標的內外邊距,此時的邊距單位是px;當開發者拿到圖後,會遇到這樣一個問題:內外邊距是由px爲單位的距離,可是在實際開發中「dp」作爲單位的更加常見,因此就會涉及到「px」「dp」互轉的問題。spa
對bitmap根據屏幕的分別率找到資源目錄下的密度文件夾。參考下表:
好比,計算方式給xhdpi(2倍圖,超高精度)級別的設備生成了一張200200px的圖像,那麼應該爲hdpi生成150150px,爲mdpi生成100100px, 爲ldpi生成7575px的圖片資源。而後,將這些文件放入相應的drawable資源目錄中:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
複製代碼
任什麼時候候,當引用@drawable/awesomeimage時系統會根據屏幕的分辨率選擇恰當的bitmap。
另外,解釋一下爲何上面表格有兩行標位紅色,緣由是2倍圖和3倍圖是主流佔比,在友盟統計中顯示以下:
其次,說一說這個XML佈局文件的適配。
實際開發時,咱們在xml佈局裏設置控件的寬高屬性都是以「dp」作爲單位,甚至還會遇到橫豎屏頁面適配狀況。前面提到了Layout適配尺寸有4種:小(small),普通(normal),大(large),超大(xLarge)
因此,咱們能夠在資源文件Layout根目錄建立不一樣尺寸的目錄,系統會根據app所運行的設備屏幕尺寸,在與之對應的layout目錄中加載layout。更多詳見Providing Resources。例如:
res/
layout/
main.xml
layout-large/
main.xml
複製代碼
Xml文件的名字相同。爲不一樣屏幕作不一樣UI處理,內容不一樣。如日常同樣在APP中引用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
複製代碼
*記得在AndroidManifest.xml文件中設置多分辨率支持:
<Supports-screens
android:largeScreens="true"
android:normalScreen="true"
android:anyDensity="true"
android:smalleScreen="true"/>
複製代碼
最後,說一說橫豎屏佈局兼容的問題。
先看下面一個例子:這一個工程中適配橫向屏幕的layout-land
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
複製代碼
默認的layout/main.xml文件用做豎屏的layout。
若是想給橫屏提供適配於大屏幕,那麼則須要使用large和land修飾符。
MyProject/
res/
layout/ # default (portrait)
main.xml
layout-land/ # landscape
main.xml
layout-large/ # large (portrait)
main.xml
layout-large-land/ # large landscape
main.xml
複製代碼
其餘屏幕適配方式:
1.儘可能使用線性佈局(LinearLayout)和相對佈局(RelateLayout),儘可能不使用絕對佈局(AbsoluteLayout)和幀佈局(FrameLayout)。 2.儘可能使用wrap_content、mach_parent讓view自適應或最大化,儘可能不要寫寬高的值。 3.使用線下佈局的百分比weight權重時,要把寬度寫成「0dp「,若是寫成wrap_coent會使佈局效果不佳等問題。 4.儘可能使用android的Shape自定義view背景,這樣會隨之自適應。 5.ImageView的ScaleType有五種方式(center,centerCrop,centerInside,fieCenter,fieXY),儘可能使用fieCenter按比例擴大至view寬度,能取得較好適配和顯示效果。 6.獲取屏幕分辨率信息,進行動態適配:DisplayMetrics metrics =newDisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);
咱們會把屏幕設置成單一的橫屏或豎屏,設置的方法是去AndroidMaifest.xml中把activity中的android:screenOrintation設置成landscape或者portrait,這種單一的屏幕模式。若是設置成"sensor",就由物理的感應器來決定。若是用戶旋轉設備這屏幕會橫豎屏切換的時候須要注意布 局問題和從新載入問題。
新的Android版本會爲咱們的app提供更棒的API,但咱們的app仍應支持舊版本的Android,直到更多的設備升級到新版本爲止。
首先,在項目清單文件中指定最小和目標API級別。具體來講,元素中的minSdkVersion和targetSdkVersion 屬性,標明在設計和測試app時,最低兼容API的級別和最高適用的API級別(這個最高的級別是須要經過咱們的測試的)。例如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
...
</manifest>
複製代碼
其次,是在代碼中判斷檢查版本信息。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); } } 複製代碼
最後,使用項目的風格和主題跟隨系統版本改變外觀。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">
複製代碼
若是喜歡本文的話,歡迎點擊一下 「喜歡」 給予鼓勵支持!