Android螢幕適配使用dimens
關於Android螢幕適配中使用多個dimens的遇到的問題
我相信大家在android開發中,肯定會遇到一個問題,那就是螢幕適配問題,通常我們做app只需要適配各種型別的手機就OK了,最近公司要求把pad上的app適配到手機上,這個有點麻煩,所以著重研究了一下。
基本概念:dp、sp、px、dpi、density
- dp:最常用的長、寬、margin、padding等的單位
- sp:字型的單位,和dp差不多,區別是如果字型使用的sp為單位,那如果你手機字型調大了,那你app的字型會隨之變大,如果用dp則不會變化。
- px:畫素
- dpi:dots per inch,即每英寸上有多少個畫素,也就是螢幕密度,具體計算下面寫說
- density:density=dpi/160
dp和px轉換
px=dp*(dpi/160)
計算dpi、density
以5.5寸1920 * 1080的手機為例:
5.5寸是指手機對角線的長度,解析度是1920 * 1080,也就是知道長畫素是1920,寬畫素是1080,那麼對角線多長呢,其實就是求斜邊的長度:
1920^2+1080^2=2202^2
所以 dpi=2202/5.5=400
(哎呀,有點囉嗦了)
需要注意的 dp是不管你手機密度有多大,它的物理尺寸是不變的,就是說,比如一個圖片設定大小100dp*100dp,那它在dpi為320的手機上就佔 200px * 200px
250px * 250px
,那麼你在螢幕上看到圖片的大小是沒有變化的
(我相信做android開發,大家對這些應該就很熟悉了,就不詳細寫了,有不清楚的請自行學習,哈哈)
說說適配的事
1.使用相對佈局
我這相對佈局的意思,不只是使用RelativeLayout,還有使用LinearLayout中的weight。(插一句,在相同層級的情況下,推薦使用LinearLayout,如果可以減少層級,則使用RelativeLayout,但是如果使用了weight,LinearLayout也就失去了它的優勢,和相對佈局一樣需要二次計算了)。
杜絕使用絕對佈局!
在寫佈局的時候,就應該考慮到螢幕大或者小,顯示會不會有問題。多想一下,很重要
我覺得只要佈局寫的好,基本可以解決90%的適配問題,當然這也是要修煉內功,才能運用順暢的。(寫的多就有經驗啦)
2.生成各種尺寸的dimens
具體如何在values生成各種尺寸的dimens.xml,請參考下面連結
http://blog.csdn.net/hnzcdy/article/details/50628993
執行結果下圖:
dimens.png
因為手機尺寸太多,所以有時候,我們不得不在不同螢幕大小,使用一些不同的值,這個時候用dimens就很方便了。
不過在這裡,我主要是說,sw240dp是啥意思,以及不同的手機具體使用哪個dimens。具體怎麼使用、生成,看上面那篇文章就可以啦。
sw:small width,最小寬度,即不管手機是橫屏還是豎屏,螢幕可展示的最小邊,比如1920*1080,那最小就是1080px。
那麼怎麼什麼手機用什麼dimen呢?怎麼算呢?
舉例說明:
- 還是以1920*1080 5.5寸的手機舉例(這種手機目前比較多)
- 這種手機呢,dpi是400,denity是2.5,就是1dp=2.5px,(前面算的)
- dimens是按著最小邊大於哪個值就找哪個值
- 那它應該用哪個dimens呢?1080/2.5=432,按著上圖我們配置的,432>360,432<480,所以,最終使用的是sw360dp的dimens.xml
- 在320dp和480dp之間,有很多手機,所以我們可以把這個區間分的細一點,比如320、340、360、380、400,這樣適配會更好點
有人可能會疑惑,為啥要算的這麼麻煩呢,因為sw360dp,說的是最小邊大於360dp就用這個dimens,但是我們知道手機解析度是畫素,是px,所以要換算一下
備註一下,使用dimens相當於是等比縮放,自己可以在DimenTool
中配置縮放比例
3.關於適配的感受
其實我覺得,要是想有好的使用者體驗,pad和手機最好還是兩套設計,畢竟兩者互動方式是有很大區別的,單純移植肯定體驗比較差。簡單一點呢,就把一些比較明顯不合適的地方,寫兩套佈局,不同尺寸使用不同的佈局。
寫的有點亂,先這樣記錄一下。