2013年3月20日 星期三

[Android] Android Developer Note Best Practices 3

Distributing to Specific Screen (見Android Developer Distributing to Specific Screens)

序言
雖然我們建議要將app設計成能正確地在多種不同的螢幕大小和解析度上跑,
你還是可以選擇去限制app給特定種類的螢幕跑(前面就有提到這樣的觀念),
比如平板限定或大螢幕限定,或者手機或小螢幕限定之類的。
要這麼做的話,你可以打開篩選(filtering),藉由額外的服務,
比如Google Play,以在manifest檔所定義的螢幕支援。

但在這之前你還是要知道支援多重螢幕的方法,
以及能將你的能力實作到最好的技巧。

Declaring an App is Only for Handsets
因為系統會自動去縮放到大螢幕,你其實不應該篩掉較大的螢幕的。
如果有看過前面的介紹的話應該可以做到支援像大螢幕的平板。
不過你可能會發現你的app沒辦法很好的縮放,
或者你本來就決定要發兩種版本來針對不同大小的螢幕了。
在這樣子的狀況下你可以使用 <compatible-screens>元素來管理。
 <compatible-screens>最少要包含一個或多個<screen>元素,
每個<screen>元素代表一個你的app相容的螢幕設定值,
同時包括了android:screenSizeandroid:screenDensity這兩個屬性,
不能少掉任何一個不然設定就會無效化。
比如下面這個設定為只支援小型中型螢幕:

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" />
        <screen android:screenSize="small" android:screenDensity="mdpi" />
        <screen android:screenSize="small" android:screenDensity="hdpi" />
        <screen android:screenSize="small" android:screenDensity="xhdpi" />
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" />
        <screen android:screenSize="normal" android:screenDensity="mdpi" />
        <screen android:screenSize="normal" android:screenDensity="hdpi" />
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>

當然你可以用這個方法來反向篩掉其他的狀況,
不過後面的方法會更簡單使用。
Declaring an App is Only for Tablets
如果你不想讓app在手持上跑,(比如真的需要大螢幕才有那個感覺XD)
或者在小螢幕上跑需要最佳化,
那麼可以使用 <supports-screens> manifest元素。
比如下面的設定會讓程式只支援tablet型態的大螢幕:

<manifest ... >
    <supports-screens android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"
                      android:requiresSmallestWidthDp="600" />
    ...
    <application ... >
        ...
    </application>
</manifest>

上面講了兩件事:
1. 聲明了app不支援small和normal(當然基本上不是tablet)
2. 聲明了app需要一個最少有600dp寬可用區域的螢幕
第一個對於這個技術的支援的裝置是跑Android 3.1以上的版本。
然後後面的 requiresSmallestWidthDp 屬性是對3.2以上的版本能做限制的,
要注意早期的版本會無法理解它因而會忽略。
當然最安全的對平台版本的規範是去設定minSdkVersion

Publishing Multiple APKs for Different Screens
儘管建議你盡量對你的app發行一個apk就好了,
Google Play還是可以允許你去發行多個apk來支援不同的版本。
比如說你想同時發行手機和平板版本,但你又沒辦法用同個apk就讓兩者都可以work,
那你就可以將兩個apk傳到相同的app列表上。
Google Play會依照螢幕的設定值來發送適當的apk給使用者。

當然...還是建議你用同一個apk來支援多個不同的裝置啦!(Google你有完沒完阿好煩歐= =)


Screen Compatibility Mode (見Android Develope Screen Compatibility Mode)

序言
提醒:
如果你已開發低於Android 3.0版本的app,
但是它可以正常重調大小到平板裝置的話,
那你應該要將螢幕的相容性模式關掉以保持最佳的使用者體驗。

Screen Compatibility Mode算是app的緊急逃生法,
並不是正確被設計來調整大小到大螢幕如平板裝置的。
從1.6版以後Android開始支援不同種類的螢幕大小,
且作掉大部分重調大小的工作使其能適應在給個螢幕上。

主要的Mode有兩種:
1. Version 1 (Android 1.6~3.1)
畫出來的稱為"postage stamp" window。
系統會先畫出UI原大小的layout,然後把餘留的部分用黑色邊框填滿。
如果要關掉這個mode的話可以選擇
    a. 將android:minSdkVersion或android:targetSdkVersion設為4以上  或
    b. 將android:resizeable設為true
2. Version 2 (Android 3.2及更高版本)
系統先畫出原大小的樣子,接著延伸到填滿螢幕。
這有點像是"zoom" in的感覺,通常會讓樣子模糊化。

大體上3.2版本以上的大螢幕允許使用者開啟螢幕相容性模式,
當app並沒有明確地在manifest檔裡定義它可以支援大螢幕的時候。
一個app也可以明確定義說它不支援大螢幕,
這樣的話螢幕相容性模式就會一直開啟。
(上) 開啟螢幕相容性模式                                     (下) 關閉螢幕相容性模式
 

Disabling Screen Compatibility Mode
如上面所說的,如果你的螢幕不需相容性模式也可以在大螢幕顯示正常的話,
那麼你就該關掉它以維持最佳的使用者體驗。
預設會跑的版本是3.2以上。
然後會開啟相容性模式的狀況大概有兩種:
1. app設定了 android:minSdkVersionandroid:targetSdkVersion兩個屬性都為10以下
    且並未使用 <supports-screens> 元素來聲明支援大螢幕。
2. app設定了android:minSdkVersionandroid:targetSdkVersion兩個屬性之一在11或以上
    且明確使用 <supports-screens> 元素來聲明不支援大螢幕

關掉的方法:
a. 最簡單的,在manifest裡面加上:

<supports-screens android:xlargeScreens="true" />

b. 簡單但有別的效果的方法,在<uses-sdk>元素設定版本:

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11" />

這聲明了你的app支援了3.0以上且被設計能運作在像是平板這樣的大螢幕上。

如果螢幕相容性模式在這之後仍然開著,
檢查 <supports-screens>屬性並確保當中沒有任何屬性被設為false。
前面也有談到如何利用 <supports-screens>元素來聲明所支援的不同螢幕大小。

Enabling Screen Compatibility Mode
當app的目標版本是Android 3.2(API level 13)或更高的話,
你可以利用 <supports-screens>元素來影響相容性模式的開關。
預設上只要你設定android:minSdkVersionandroid:targetSdkVersion兩個屬性之一在11或以上
螢幕相容性模式就不會提供給使用者了。如果兩個之一成立但卻沒有正確地重調大小,
你可以選擇去打開螢幕相容性模式用底下的方法:
在manifest檔裡將<supports-screens> 元素加上,
並且將android:compatibleWidthLimitDp 屬性設定成320。

<supports-screens android:compatibleWidthLimitDp="320" />

這指定了最大的"最小螢幕寬",你告訴系統說你的app是設計給320dp用的,
這樣只要任何一個裝置的最小邊比這個值大,系統就會提供相容性模式,
作為使用者的選擇功能了。
注意:
目前如果 android:compatibleWidthLimitDp比320還大的話就不會提供相容性模式。

如果你的app是當使用大螢幕重調大小的時候在功能上失效,
且你要強迫使用者進入螢幕相容性模式而非只提供選項的話,
你可以使用android:largestWidthLimitDp屬性:

<supports-screens android:largestWidthLimitDp="320" />

這個運作狀況會和上面android:compatibleWidthLimitDp一樣,
只差在它是強制開啟而且不讓使用者關掉。





沒有留言:

張貼留言