1. 程式人生 > >Android多螢幕適配-平板

Android多螢幕適配-平板

轉載請註明出處!!!!

 *本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出  

http://mp.weixin.qq.com/s/ddAoWXlU8QeZmlmtSP6sgw

這幾天做關於平板的專案,發現用之前的多螢幕適配方案,會直接執行閃退,報的錯誤是找不到指定的資源,克服了懶惰的心,翻牆查了api文件。找到了問題。記錄下來。

1、如何劃分手機和平板的

人為判斷方法:大於6英寸的就是平板。小於6英寸的都是手機。

平板尺寸:6英寸、7英寸、10英寸、14英寸...

note:6英寸是手機和平板的閥值。但是還沒有找到系統是根據什麼來判斷是手機還是平板。待驗證。歡迎提供證據。

ps1:有人說根據(getResources().getConfiguration().screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK)>=Configuration.SCREENLAYOUT_SIZE_LARGE來判斷是否是平板。檢視原始碼,Configuration.SCREENLAYOUT_SIZE_LARGE的值至少是480x640dp,即sw480dp。而sw480dp是中間平板電腦。例如Streak 480x800mdpi。這個點來看,這個公式是成立的。但是使用該方法的準確性有待驗證。因為5英寸的手機和7英寸的平板都在Configuration.SCREENLAYOUT_SIZE_LARGE範圍內。

2、平板-tablet

Android手機系統是2.x,4.x,5.x等,但是Android系統的Tablet裝置是從3.0開始的,且3.x系統只有平板才有。Android3.0是專門為平板服務的系統。但是從4.0以後,看起來能運行於手機的也同樣能運行於平板。但是,如果使用手機適配的方法用於平板是不可行的。通過查詢Google文件可知,Android平板的適配要使用限定符swxxxdp。

原因:手機螢幕的適配是根據資源限定符value-mdpi-xxx或者value-ldpi-xxx。在values資料夾下的dimens檔案裡沒有預設值也沒有關係,系統會最匹配原則。但是Tablet裝置資源查詢的限定符不是mdpi、ldmpi這樣的限定符。而是swxxxdp限定符查詢。所以如果使用手機螢幕適配的方法來適配,系統不認識mdpi資料夾下的尺寸,會去找values資料夾下的dimens檔案裡的尺寸。沒有找到swxxxdp也沒有找到預設尺寸,就會報資源找不到異常。

3、平板-Tablet適配原則-最小寬度限定符


對於Android3.0的平板,宣告平板Tablet的正確方式是將資源放在有xlarge配置限定符的目錄,本質上是使用螢幕尺寸限定符,例如res/layout-xlarge/。為適應多螢幕尺寸,Android3.2引入了更具體的螢幕尺寸指定資源的方式。

裝置Tablet在3.0系統時可以使用螢幕限定符small、normal、large、xlarge等命名備用資源,從3.2以後,Tablet使用新的限定符smallestWidth,限定符值為sw<n>dp。

選擇一個寬度並將其設計為最小尺寸(基本上這個最小寬度要跟ui溝通好,可用ui的設計基準作為最小寬度),或者在佈局設計玩完成後測試其支援的最小寬度。

sw<n>dp:最小寬度限定符。

例如:(取兩個尺寸的最短者)

裝置1024x480mdpi=sw480dp

裝置1024x600mdpi=sw600dp

裝置480x600mdpi =sw480dp

裝置480x640mdpi=sw480dp

裝置2560x1440mdpi=sw1440dp

Tablet裝置常見的螢幕寬度值:

sw320dp:常見手機螢幕。(240x320ldpi、320x480mdpi、480x800hdpi等)

計算過程:480x800hdpi的最小寬度是480hdpi,換算成dp就是480hdpi*0.75=320dp。同理,240x320ldpi最小寬度是240ldpi,換算成dp單位240ldpi/0.75=320dp。

mdpi是基準,1mdpi=1dp;1ldpi=0.75dp;1hdpi=1.5dp;1xhdpi=2dp;1xxhdpi=3dp;1xxxhdpi=4dp。對這個公式不熟的看前一篇Android多螢幕適配-手機

sw480dp:中間平板電腦,例如Streak(480x800mdpi)

sw600dp:7英寸平板電腦(600x1024mdpi)

sw720dp:10英寸平板電腦(720x1280mdpi、800x1280mdpi等)

總結:平板的適配基準sw480dp、sw600dp、sw720dp等,手機螢幕的適配基準是mdpi、hdpi、xhdpi等。

注意:這裡的單位必須是dp單位。資源使用“最小寬度限定符”sw<N>dp用於指定螢幕兩邊的最小值,而不管裝置當前的方向如何。因此使用sw<N>dp是指定 佈局可用於整體螢幕尺寸的簡便方法,它會忽略螢幕的方向。ps:當橫豎屏切換時,width和height值也會交換。


宣告尺寸支援

在清單檔案AndroidManifest中可以通過宣告來說明當前應用支援哪些螢幕。如果應用支援Android支援的所有螢幕尺寸(最小螢幕尺寸是426dpx320dp),則不需要此步驟。

Android 3.2 為 <supports-screens> 清單元素引入了新的屬性:

android:requiresSmallestWidthDp:指定應用只用於最小寬度值。設定此值之後,只有裝置的smallestWidth必須大於等於此值,才能使用該應用。

例如:如果應用只用於最小可用寬度為600dp的平板電腦樣式裝置,則在清單檔案中宣告如下:

<manifest ... >
    <supports-screens android:requiresSmallestWidthDp="600" />
    ...
</manifest>

設定了該屬性之後,如果裝置是1024x720mdpi的可以下載此應用,因為1024x720mdpi的最小螢幕寬度是720mdpi,但是應用在清單檔案中設定的是600dp。720mdpi>600dp

如果裝置是1024x720hdpi的就不能能下載此應用,因為1024x720hdpi的最小螢幕寬度是720hdpi*1.5=480dp。sw480dp<600dp。以此類推。

使用者裝置的兩個尺寸(widthxheight)的最小值必須大於等於android:requiresSmallestWidthDp值才能下載,但不影響裝置執行。

注意:此值目前設定無效。因為此值的設定並不影響系統執行,而是在應用商店上過濾應用。所以,如果想要使應用不支援小螢幕,就要使用其他的尺寸屬性,而不應該使用該屬性。因為不起效果。

android:compatibleWidthLimitDp:指定應用支援的最大“最小寬度”,將螢幕相容性模式用作使用者可選的功能。如果裝置可用螢幕的最小邊大於您在這裡的值, 使用者仍可安裝您的應用,但提議在螢幕相容性模式下執行。預設 情況下,螢幕相容性模式會停用,並且您的佈局照例會調整大小以 適應螢幕,但按鈕會顯示在系統欄中,可讓使用者開啟和關閉螢幕相容性 模式。

例如:如果在清單檔案中設定該屬性的值為600,則如果使用者的裝置是1024x720mdpi=sw720dp,則使用者可以仍可以安裝.

注意:如果應用可針對大螢幕正確調整大小,則無需使用此屬性。建議不要使用此屬性,而是按照建議,確保應用的佈局針對較大螢幕調整大小。

android:largestWidthLimitDp:此屬性可指定應用支援的最大“最小寬度”來強制啟用螢幕相容性模式。如果裝置可用螢幕的最小邊大於該值,應用將在螢幕相容模式下執行,且使用者無法停用該模式。

注意:建議不要使用此屬性來針對多螢幕適配。

4、使用示例

ui基準是1024x552mdpi。則螢幕寬度值的基準設定為sw552dp或sw600dp.

對於不同的螢幕密度的設定如下:

1024x552mdpi=sw552dp或者sw600dp或者sw600dp-1024x552

1024x552hdpi=sw828dp或者sw828dp-1024x552

以此類推,保證sw限定符的單位是dp即可。

以1024x552mdpi基準舉例,適配1200x400hdpi,資源應該是sw600dp-1200x400

注意:螢幕1024x552mdpi和1200x400hdpi,都可以使用同一個sw600dp資源。

注意:最好要在values下的dimens設定預設值。

參考資料:

Google官方文件

https://developer.android.com/guide/practices/screens_support.html