序言:
雖然我們建議要將app設計成能正確地在多種不同的螢幕大小和解析度上跑,
你還是可以選擇去限制app給特定種類的螢幕跑(前面就有提到這樣的觀念),
比如平板限定或大螢幕限定,或者手機或小螢幕限定之類的。
要這麼做的話,你可以打開篩選(filtering),藉由額外的服務,
比如Google Play,以在manifest檔所定義的螢幕支援。
但在這之前你還是要知道支援多重螢幕的方法,
以及能將你的能力實作到最好的技巧。
Declaring an App is Only for Handsets:
因為系統會自動去縮放到大螢幕,你其實不應該篩掉較大的螢幕的。
如果有看過前面的介紹的話應該可以做到支援像大螢幕的平板。
不過你可能會發現你的app沒辦法很好的縮放,
或者你本來就決定要發兩種版本來針對不同大小的螢幕了。
在這樣子的狀況下你可以使用
<compatible-screens>
元素來管理。<compatible-screens>
最少要包含一個或多個<screen>元素,每個<screen>元素代表一個你的app相容的螢幕設定值,
同時包括了android:screenSize和android: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:minSdkVersion
和android:targetSdkVersion
兩個屬性都為10以下,且並未使用
<supports-screens>
元素來聲明支援大螢幕。2. app設定了
android:minSdkVersion
和android: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:minSdkVersion
和android: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
一樣,只差在它是強制開啟而且不讓使用者關掉。
沒有留言:
張貼留言