Android自適應基礎

Android系統開放,設備衆多,自適應是個很麻煩的工程。不僅不同系統版本的適應,最頭痛的還是不同分辨率、不同像素密度的適配。網上有很多談自適應技巧的文章,有些可能看着不是很理解甚至有些帶着坑,所以有必要先對一些基礎概念有所瞭解,再談自適應吧。

 

一、首先解釋一個概念:屏幕密度

1、解釋:英文表述爲dpi:dots per inch,或者PPI:pixels per inch。意思很明顯是每英寸的像素點數。

     另外提醒下,平常所說的手機或者平板是多少寸的,是指屏幕的對角線是多少英寸。

2、計算:假設屏幕分辨率寬高爲 w × h,尺寸爲 size 英寸,密度爲 dpi,那麼結合勾股定理很容易算出以下公式

      dpi = \sqrt{w^2+h^2}/size

例如屏幕是1080×1920,5英寸的設備,那麼算出來密度大約是440。但實際上,從機器獲取的densityDpi是480,怎麼獲取可參考另一篇很簡單的博文 https://blog.csdn.net/lin_dianwei/article/details/82806575 。這是因爲Android規定了幾個密度值,不然的話各種各樣的密度值無法做統一處理。幾個密度值如下: 

密度 ldpi mdpi hdpi xhdpi xxhdpi
密度值 120 160 240 320 480
比例 3 4 6 8 12

有些地方,在每個密度下面還指定了一個分辨率,比如1080×1920對應xxhdpi,個人覺得這樣會誤導一批人,誤認爲1080×1920密度就一定是xxhdpi,其實看公式就知道,這裏忽略了一個尺寸變量。

 

二、ldpi、mdpi、hdpi、xhdpi、xxhdpi有何用

1、看Android工程資源目錄res下,就存在着drawable-ldpi、drawable-mdpi、drawable-hdpi等對應的幾個目錄。

它們的作用是,比如你的設備是hdpi的,你放了一個寬高都爲100px的圖片在drawable-mdpi下面,那麼加載時系統會自動按照上面的比例,把圖片放大成寬高爲150px,如果把圖片放drawable-hdpi下,那麼加載下來的圖片還是100px。

所以,我們的應用要適應不同密度的設備,一般來講我們只需要做一套圖放到對應的目錄下,那麼就可以自動適應其他密度的設備。

2、比如要適配分辨率爲1280×800和1920×1200,尺寸都爲10.1寸的設備,經過計算這兩設備的密度爲mdpi和hdpi。那麼我們可以在PS中按照畫布1920×1200的大小做一套圖放在drawable-hdpi下就可以了,當然也可以做一套1280×800的圖放drawable-mdpi下。站在UI人員的角度上,他做了一套像素爲1920×1200的圖片,那麼裏面的一些座標,很可能也是按照像素px來算的,比如標註個150px,在hdpi機器上是150px,在mdpi機器上應該是100px。那麼我們程序是否需要按照不同的密度分開兩套不同的座標呢?比如values-ldpi、values-mdpi、values-hdpi等。其實可以不需要。

這裏先引入一個dp的概念,dp是與密度無關的抽象單位,在每英寸160點的顯示器上,1dp = 1px,在每英寸240點的顯示器上,1dp = 1.5px,跟上面表格密度比例一致。

這樣我們只需要在values下設置個<dimen name="test">100dp</dimen>就可以了,在mdpi機器上就是100px,在hdpi機器上就是150px,剛剛好。用getResources().getDimension(R.dimen.test)方法讀取出來分別是100和150。所以一般程序都會使用dp爲單位,而不是px。除非有些地方需要很細的的分隔線,可以使用1px這樣。

 

三、字體sp

簡單說下sp,跟用px表示的差別是sp的可以隨着系統的字體大小而改變,而px不會。所以一般字體用sp就可以了。

 

暫時這些,有想到再補充。相信理解了一些基礎後,對自適應工作會更有幫助。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章