導言
進行android 開發以及有一段時間了,從大學的時候android 1.6開始關注,到現在android 4.2都出來了,一步步的見證了 android 的成長,今天,看了一下android版本的分布圖,根據google 的官方顯示android 4.0 以上的設備已經有 34.2%,由於,國內很多的手機都沒機會用上google play市場,所以國內市場的情況,得看類似於友盟的季度報告才知道了,好了,反正個人覺得,android 4.0 以后設備才能有讓人用的欲望,之前的版本受限於硬件,和系統的優化程度,個人覺得,除了打個電話,收個短信,看個微博,上個QQ以外,也沒多大讓人使用的 價值了,至於原因,知道的都會知道,不知道也就不知道了.現在,硬件技術的發展,我們很方便就能購買到性能足夠強勁,價格足夠廉價的android 4.0以后的手機和平板,那么,現在,我們學習android 4 的設計風格也算是不晚.
所謂類響應式設計
這篇文章的標題為類響應式設計,有搞個web開發的應該都知道,所謂的響應式設計,就是一個網頁能夠根據是電腦的訪問或者手機的訪問進行的一個響應的顯示,在google 官方設計指導文檔里面,也有相關的說明http://developer.android.com/design/patterns/multi-pane-layouts.html, 相比 web 的響應式設計思想,在android上使用這種思想,只能稱作為類似而已,因為相比web 的終端復雜而已,android就相對於比較簡單,因為在android上面你只需要考慮,簡單的來說,就是什么時候顯示一個pane,什么時候顯示兩個 pane的問題而已.
設計的理論基礎
要解決android 應用什么時候顯示一個pane,什么時候,我們需要了解一些android 是如何解決各種分辨率下的兼容性問題.
在做桌面軟件的時代,我們很少發現有人會吐槽,不同分辨率下的情況,至於原因,我個人覺得,第一,電腦的分辨率很多,但是屏幕的dpi/ppi 其實都差不多,這就使以像素為單位的計量參數在不同屏幕下的其實顯示區別不大,第二點,就是pc上的軟件的窗口是可調節的,而手機或者平板上你很少看到 (當然,現在三星的一些android設備支持這個).但是,移動設備上就完全不同了,首先,產生兼容性的問題,根源在於對顯示一個像素改多大的問題,在 高密度的手機屏幕上,一個像素被顯示的非常之小,那么我們假設用100個像素本來是想顯示2厘米左右的長度,但是結果卻只顯示了1厘米,第二點就是,移動 設備不支持窗口的縮放,如果我定義了一個100像素的單位,那就永遠沒有用戶可以調節的空間.對於這個問題,其實android 官方已經提供了很好的解決方案,就是不依賴像素的計量單位,讓系統根據屏幕密度來渲染像素.
一張圖片:
一個公式:
px = dp * (dpi / 160)
如果,你是嚴格按照以上兩點來設計你的程序的話,那你分辨率的兼容問題,你就不需要額外操心了.當然,要做到這點,需要在設計的時候操心.
android程序的實現
上面,討論了一堆理論上的東西,估計大家都看煩了,那么在android上具體是該怎么實現的呢?
設計規則
首先我們來看一張圖:
從這張圖里面我們可以大致了解到手機和平板的最簡單的區別就在於屏幕是否有一邊大於 600dp,那么我們繪制一幅流程圖
顯示一個pane,還是多個pane
如果,我們把平板和手機的設計,只是簡單的認為是手機上顯示一個pane,平板上顯示多個pane,這也未免太過於膚淺了.
在web設計上,我們有個div的概念,對於這個概念,我們可以很平滑的過渡到我們android應用的設計上.在android 4 以后,實際上是android 3以后,google意識到android的平板的魅力不足以讓我們專門針對平板再開發一次(例如iPad),所以,引入了類似於web 的設計方案,將每個view徹底的獨立起來,讓activity只是作為這些view 的容器,在fragment推出以前,我們要做出設計,需要話很多的心力,因為,我們需要自己手工維護實現每個view 的生命周期,而有了fragment,我們就有了一套穩定的機制(有針對於android4 以前的兼容包).接下來,我們只需要考慮的是,我們的應用整個邏輯該怎么處理,在我研究了多個,android 自適應的app以后,得出了一個關於 600dp的法則.
所謂600dp法則
我們從上邊可以知道,手機與平板的區分點就是長或者高達到了600dp的大小,那么這個600dp究竟能做什么?首先,600dp是手機與平板的區 分點,而手機與平板最大的不同就是一個屏幕能顯示內容多少的問題,如果,以手機的顯示為一個pane單位,那么對於大於600dp而言,我們可以考慮在一 個屏幕下放多一個pane.(關於為什么選擇600dp可以參考諸多google android apps)
現在,我們以開源中國的客戶端為例,來說說如何在實踐中這個法則.
原版客戶端在某手機上顯示:
接着在某平板(寬超過 600dp)上顯示:
我們會很容易的發現,在對於大於600dp的設備上來看的話,在屏幕利用率而言,遠遠不夠.接下來我們針對這點進行600dp法則的使用.進行改版后的顯示
根據600dp法則改造后的顯示
關於橫屏
我們都知道,手機橫屏以后似乎多了不少空余的空間,那么我們是否可以考慮放多個pane呢?
首先,我們要考慮的是我們的應用針對的是平板還是手機,而不是關於如何利用好屏幕的空間,而這里600dp剛好是能區分手機和平板的最好的大小.如 果你要考慮的是手機和平板的設計,你只需要考慮一個app在手機和平板上的不同點,如果你考慮的是如何利用好屏幕的使用率,請根據手機或者平板分別設計一 套.
推薦讀物
http://developer.android.com/guide/practices/screens_support.html
http://developer.android.com/training/multiscreen/screensizes.html
在線工具
計算DPI的 http://members.ping.de/~sven/dpi.html
哪位大神有空的話,要不移植到runjs 造福大眾吧...記得通知我!
關於源碼
該項目同樣是開源的,如果,你要跑起來的話,需要同時下載原版的osc android app源碼,把原版項目設置為android libs,然后引入.如果你不了解什么是android libs 項目的話,我建議你去google 一下,這里不做任何說明.由於是業余愛好,請不要抱有太多希望