Android關於適配的相關知識。

本文出自:http://www.androidlearner.net/android-multi-screen-about.html

http://blog.csdn.net/moruite/article/details/6028547

Android適配可以分爲兩個領域,一就是各版本間由於api的不同導致的適配,二就是不同屏幕分辨率的適配;

怎樣適配多個版本

 在Android系統中向下兼容性比較差,但是一個應用APP經過處理還是可以在各個版本間運行的。向下兼容性不好,不同版本的系統其API版本也不同,自然有些接口也不同,新的平臺不能使用舊的API,舊的平臺也使用不了新的API。

        爲了應用APP有更好的兼容性,咱們可以利用高版本的SDK開發應用,並在程序運行時(Runtime)對應用所運行的平臺判斷,舊平臺使用舊的API,而新平臺可使用新的API,這樣可以較好的提高軟件兼容性。


        那麼,如何在軟件運行時做出這樣的判斷呢?答案下邊揭曉:


  在Android SDK開發文檔中有段話這樣的話:

Check System Version at Runtime(在軟件運行時檢查判斷系統版本)


Android provides a unique code for each platform version in theBuild constants class. Use these codes within your app to build conditions that ensure the code thatdepends on higher API levels is executed only when those APIs are available on the system.

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);
    }
}


Note: When parsing XML resources, Android ignores XML attributes that aren’t supported by the current device. So you can safely use XML attributes thatare only supported by newer versions without worrying about older versions breaking when theyencounter that code. For example, if you set thetargetSdkVersion="11", your app includes the ActionBar by defaulton Android 3.0 and higher. To then add menu items to the action bar, you need to setandroid:showAsAction="ifRoom" in your menu resource XML. It's safe to do this in a cross-version XML file, because the older versions of Android simply ignore theshowAsAction attribute (that is, you do not need a separate version inres/menu-v11/).


           從上面可以知道Android爲我們提供了一個常量類Build,其中最主要是Build中的兩個內部類VERSION和VERSION_CODES,

VERSION表示當前系統版本的信息,其中就包括SDK的版本信息,用於成員SDK_INT表示;

對於VERSION_CODES在SDK開發文檔中時這樣描述的,Enumeration of the currently known SDK version codes. These are the values that can be found inSDK. Version numbers increment monotonically with each official platform release.

其成員就是一些從最早版本開始到當前運行的系統的一些版本號常量。

  在我們自己開發應用過程中,常常使用如下的代碼形式判斷運行新API還是舊的API:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
    {
            // 包含新API的代碼塊
    }
    else
    {
            // 包含舊的API的代碼塊
    }

其中HONEYCOMB是Android一個版本的代號,也就是說如果當前系統的版本比這個版本高的話就用新的API否則就用舊的版本。

Android 不僅硬件種類衆多,ui的適配一般通過layout佈局去實現;

而對於 target sdk 對不同機器的兼容應該使用以下策略:

1.應該儘量使用較高版本的sdk去編譯,android-build-path 中去設置
2.在使用相關的sdkapi時,應該針對明白對不同sdk去處理,對應一些int宏,實際上編譯後會這些靜態變量就會編程基礎類型,所以是沒有問題的;但是對於一些系統方法來說,只有高版本rom纔有,對應開發環境就是Android.jar 最終安裝後,會調用/system/xx/framwork.jar 裏面的東西

所以最後總結一下:編譯儘量用高版本,但是在處理特定函數時,應該根據build.version去處理區分處理。



怎樣適配多種屏幕?

a.在manifest裏定義你的程序支持的屏幕類型,相應代碼如下:

<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]   //是否支持小屏
android:normalScreens=["true" | "false"]  //是否支持中屏
android:largeScreens=["true" | "false"]   //是否支持大屏
android:xlargeScreens=["true" | "false"]  //是否支持超大屏
android:anyDensity=["true" | "false"]    //是否支持多種不同密度的屏幕
android:requiresSmallestWidthDp=”integer”
android:compatibleWidthLimitDp=”integer”
android:largestWidthLimitDp=”integer”/>

b.對不同大小的屏幕提供不同的layout:

  比如,如果需要對大小爲large的屏幕提供支持,需要在res目錄下新建一個文件夾layout-large/並提供layout。當然,也可以在res目錄下建立layout-port和layout-land兩個目錄,裏面分別放置豎屏和橫屏兩種佈局文件,以適應對橫屏豎屏自動切換。

c.對不同密度的屏幕提供不同的圖片。
應儘量使用點9格式的圖片,如需對密度爲low的屏幕提供合適的圖片,需新建文件夾drawable-ldpi/,並放入合適大小的圖片。相應的,medium對應drawable-mdpi /,high對應drawable-hdpi/,extra high對應drawable-xhdpi/。
圖片大小的確定:low:medium:high:extra high比例爲3:4:6:8。舉例來說,對於中等密度(medium)的屏幕你的圖片像素大小爲48×48,那麼低密度(low)屏幕的圖片大小應爲36×36,高(high)的爲72×72,extra high爲96×96。

不同密度的屏幕對應的圖片比例:

http://www.androidlearner.net/wp-content/uploads/2011/10/screens-densities.png

怎樣進行語言適配呢?

語言適配需要在res文件夾下建立一些對應語言固定文件名的文件夾(因爲系統要根據這個名字來確定用那種語言,當然是用戶設置語言之後,系統根據這些文件夾,尋找對應的變量值),裏面放上strings.xml這樣的文件,裏面對應的語言。

(關於更多相關的res下屏幕適配相關的文件命名規則,請參考官方文檔:http://developer.android.com/guide/topics/resources/providing-resources.html

For example:

其中values-en-rUS是指英語(美國),代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello_world">Hello,World!</string>
</resources>
values-zh-rCN是指中文(簡體),代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello_world">你好,世界!</string>
</resources>
其中:語言文件對應的目錄名字如下所示:

    android多國語言文件夾文件彙總如下:  
      
    中文(中國):values-zh-rCN  
      
    中文(臺灣):values-zh-rTW  
      
    中文(香港):values-zh-rHK  
      
    英語(美國):values-en-rUS  
      
    英語(英國):values-en-rGB  
      
    英文(澳大利亞):values-en-rAU  
      
    英文(加拿大):values-en-rCA  
      
    英文(愛爾蘭):values-en-rIE  
      
    英文(印度):values-en-rIN  
      
    英文(新西蘭):values-en-rNZ  
      
    英文(新加坡):values-en-rSG  
      
    英文(南非):values-en-rZA  
      
    阿拉伯文(埃及):values-ar-rEG  
      
    阿拉伯文(以色列):values-ar-rIL  
      
    保加利亞文:  values-bg-rBG  
      
    加泰羅尼亞文:values-ca-rES  
      
    捷克文:values-cs-rCZ  
      
    丹麥文:values-da-rDK  
      
    德文(奧地利):values-de-rAT  
      
    德文(瑞士):values-de-rCH  
      
    德文(德國):values-de-rDE  
      
    德文(列支敦士登):values-de-rLI  
      
    希臘文:values-el-rGR  
      
    西班牙文(西班牙):values-es-rES  
      
    西班牙文(美國):values-es-rUS  
      
    芬蘭文(芬蘭):values-fi-rFI  
      
    法文(比利時):values-fr-rBE  
      
    法文(加拿大):values-fr-rCA  
      
    法文(瑞士):values-fr-rCH  
      
    法文(法國):values-fr-rFR  
      
    希伯來文:values-iw-rIL  
      
    印地文:values-hi-rIN  
      
    克羅里亞文:values-hr-rHR  
      
    匈牙利文:values-hu-rHU  
      
    印度尼西亞文:values-in-rID  
      
    意大利文(瑞士):values-it-rCH  
      
    意大利文(意大利):values-it-rIT  
      
    日文:values-ja-rJP  
      
    韓文:values-ko-rKR  
      
    立陶宛文:valueslt-rLT  
      
    拉脫維亞文:values-lv-rLV  
      
    挪威博克馬爾文:values-nb-rNO  
      
    荷蘭文(比利時):values-nl-BE  
      
    荷蘭文(荷蘭):values-nl-rNL  
      
    波蘭文:values-pl-rPL  
      
    葡萄牙文(巴西):values-pt-rBR  
      
    葡萄牙文(葡萄牙):values-pt-rPT  
      
    羅馬尼亞文:values-ro-rRO  
      
    俄文:values-ru-rRU  
      
    斯洛伐克文:values-sk-rSK  
      
    斯洛文尼亞文:values-sl-rSI  
      
    塞爾維亞文:values-sr-rRS  
      
    瑞典文:values-sv-rSE  
      
    泰文:values-th-rTH  
      
    塔加洛語:values-tl-rPH  
      
    土耳其文:values--r-rTR  
      
    烏克蘭文:values-uk-rUA  
      
    越南文:values-vi-rVN  


 

1.術語和概念

術語

說明

備註

Screen size(屏幕尺寸)

指的是手機實際的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸

摩托羅拉milestone手機是3.7英寸

Aspect Ratio(寬高比率)

指的是實際的物理尺寸寬高比率,分爲long和nolong

Milestone是16:9,屬於long

Resolution(分辨率)

和電腦的分辨率概念一樣,指手機屏幕縱、橫方向像素個數

Milestone是854*480

DPI(dot per inch)

每英寸像素數,如120dpi,160dpi等,假設QVGA(320*240)分辨率的屏幕物理尺寸是(2英寸*1.5英寸),dpi=160

可以反映屏幕的清晰度,用於縮放UI的

Density(密度)

屏幕裏像素值濃度,resolution/Screen size可以反映出手機密度,

 

Density-independent pixel (dip)

指的是邏輯密度計算單位,dip和具體像素值的對應公式是dip/pixel=dpi值/160,也就是px = dp * (dpi / 160)

 

 

2. DPI值計算

比如:計算WVGA(800*480)分辨率,3.7英寸的密度DPI,如圖1所示

 

               圖1 

Diagonal pixel表示對角線的像素值(=),DPI=933/3.7=252

 

 

 

3.手機屏幕的分類

 

3.1根據手機屏幕密度(DPI)或屏幕尺寸大小分爲以下3類,如圖2所示

 

 

                         

                          圖2

 

3. 2手機屏幕分類和像素密度的對應關係如表1所示:

 

Low density (120), ldpi

Medium density (160), mdpi

High density (240), hdpi

Small screen

QVGA (240x320)

 

 

Normal screen

WQVGA400 (240x400)WQVGA432 (240x432)

HVGA (320x480)

WVGA800 (480x800)WVGA854 (480x854)

Large screen

 

WVGA800* (480x800)WVGA854* (480x854)

 

                                      表1

3.3手機尺寸分佈情況(http://developer.android.com/resources/dashboard/screens.html)如圖3所示,目前主要是以分辨率爲800*480和854*480的手機用戶居多


                                                        圖3

   從以上的屏幕尺寸分佈情況上看,其實手機只要考慮3-4.5寸之間密度爲1和1.5的手機

4 UI設計

從開發角度講,應用程序會根據3類Android手機屏幕提供3套UI佈局文件,但是相應界面圖標也需要提供3套,如表2所示

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

36 x 36 px

48 x 48 px

72 x 72 px

Status Bar

24 x 24 px

32 x 32 px

48 x 48 px

Tab

24 x 24 px

32 x 32 px

48 x 48 px

Dialog

24 x 24 px

32 x 32 px

48 x 48 px

List View

24 x 24 px

32 x 32 px

48 x 48 px

                                        表2

5 如何做到自適應屏幕大小呢?

1)界面佈局方面 

   需要根據物理尺寸的大小準備5套佈局,layout(放一些通用佈局xml文件,比如界面中頂部和底部的佈局,不會隨着屏幕大小變化,類似windos窗口的title bar),layout-small(屏幕尺寸小於3英寸左右的佈局),layout-normal(屏幕尺寸小於4.5英寸左右),layout-large(4英寸-7英寸之間),layout-xlarge(7-10英寸之間)

2)圖片資源方面 

  需要根據dpi值準備5套圖片資源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi

Android有個自動匹配機制去選擇對應的佈局和圖片資源


筆記想做到這了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章