- 基本觀念:
- Resolution(px): 就是我們熟知的解析度, 如1024x600.
- Size(dp/dip): 在Android上實際看到的大小, 若定義100dp, 實際在各種尺寸, dpi定義正確的裝置上, 看起來的實際大小應該要差不多.
- Density(dpi): Dot Per Inch, 每一英寸有幾個點.
- px = dp * (dpi / 160) Android官方公式
- 問題: DPI設定錯誤會發生什麼事情
- 在開發Android Platform時必須要決定dpi的數值, 錯誤的dpi會讓程式UI比例呈現異常, 如Galaxy Tab 7". (該device設定dpi為240, 表示螢幕每一英寸應該要能夠顯示240個點, 但根據DPI Calculator, 7" 1024x600每一英寸只能顯示169個點, 所以當ui resource是用dp定義width/ length的話, 經過公式換算後, 實際看到都會被放大約1.5倍)
- 研究 : 今天如果我們有個裝置是7" 1280x800解析度, 那我們的dpi到底該定義多少?
- 若根據DPI Calculator, 該裝置每一英寸能看到215個點, 反推螢幕上能顯示的大小
- 寬1280 = dp * (215/160), dp約為 952dp
- 高 800 = dp * (215/160), dp約為 595dp
- Android Developer - Configuration Example, 直接定義了各尺寸螢幕該容納的dp大小
- 320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
- 480dp: a tweener tablet like the Streak (480x800 mdpi).
- 600dp: a 7” tablet (600x1024 mdpi).
- 720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).
- 若為7"裝置, 所以就用600 dp來反推dpi
- 高 800 = 600 * (dpi/160), dpi約為 213dp
- 之所以是用寬度width反推, 而不是高度height反推是因為, 在操作畫面的時候, 垂直空間不足時, 上下滑動是很直覺的操作, 但左右移動卻比較罕見, 寬度width定義大小必須要比較注意.
- 所以Android Developer新增了Declaring Tablet Layouts for Android 3.2, 優先考慮smallest width dp(layout-swXXXdp)
- 因此得知7" 1280x800的顯示空間為961dp * 600dp, 須設定為213dpi
- 個人結論
- UI到底要用怎麼設計?
- 目標裝置解析度是1280x800就畫1280x800 px的圖.
- 在定義layout resource時, 要用dip/dp指定長寬, 而非px. (利用px = dp * (213/160)可推出dp)
- 使用Relative Layout, 而非Absolute Layout
- 想要支援dp較小的裝置要怎麼辦?
- 定義不同的layout吧, 如layout-normal.
Ref:
1. http://developer.android.com/guide/practices/screens_support.html
2. http://developer.android.com/guide/topics/resources/providing-resources.html
3. http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html
4. DPI Caclulator