2011年8月2日 星期二

Android dpi / px / dp / 研究

最近工作上剛好遇到Android dpi 相關的問題, 紀錄一下研究筆記.
  • 基本觀念:
    • 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

Synergy 多電腦分享輸入裝置好工具

Synergy讓你能夠用延伸桌面的方式來操作兩台不同的電腦
當有兩台螢幕分別接到不同電腦時, 你的滑鼠可以自由來去之間爽度是非常高的!!(不過當然要在同一區域網路XD)

官網: http://synergy-foss.org/
支援很多平台, 我是使用Ubuntu + OSX

Ubuntu 可以用 aptitude 安裝
sudo aptitude install synergy
OSX可以用 brew
brew install synergy
裝好之後在鍵盤滑鼠所接到的那台電腦上(簡稱控制端)還需要加入config檔案, 看官網好像很複雜, 其實沒有要設定什麼特殊功能的話, 只要指定好hostname跟相對方位而已
附上我的設定檔跟簡單說明
section: screens
    #指定你的電腦名稱
    jason-mbp.local:   #這台是我的mac
    jason-pc:               #Ubuntu
end 
section: links
    #指定你的螢幕相對位置, 我的ubuntu在左邊, mac在右邊
    jason-mbp.local:
        left = jason-pc
    jason-pc:
        right = jason-mbp.local
end

電腦名稱在OSX/Ubuntu的 ternimal下輸入hostname就可以知道, windows好像就是系統名稱
設定檔弄好之後在控制端電腦輸入
synergys -c /usr/local/Cellar/synergy/1.3.6/bin/synergy.conf -a 192.168.1.122
設定檔位置跟本機ip記得換成自己的

遙控端輸入
synergyc 192.168.1.122
就可以享受偽雙螢幕啦lol

Special Thanks: Yuren ju
我本來用很蠢的遠端桌面超痛苦, 這樣好用多了