文章出處

      在Android手機的誕生之初,由于Android系統是開源的,一開始便有眾多的OEM廠商對Android手機進行深度定制,于是乎Android手機的皮膚和屏幕大小都變得百花齊放,這可苦逼了我們這群開發者,因為我們被要求要注意寫出一個好的Android軟件,寫一次代碼就能適應大小不同的屏幕。這就好比,你做了一套衣服,要讓不同身材的人都穿得合身,類似于生活中的道理,我們這套衣服肯定不能用沒有彈性的布料,所以我們要像生活中那種無尺碼,有彈性的衣服學習,在代碼里面盡量讓界面能夠自動適應屏幕的大小,幸好Android操作系統提供了一些這方面的屏幕適應機制。

       屏幕上的圖案最終就是由一個個的點構成的,也就是說我們最終要控制的就是怎么合理地拉伸屏幕上的點,以便讓界面合理地鋪到界面上,好像專門為了用戶手中的這塊屏幕開發的一樣,android中的界面顯示單位主要有px,dp(dip),sp等,下面我們將簡單地介紹它們并提出在什么場合使用。

幾乎是一條定律:

除了sp和dp,不要使用別的單位,除非你沒有辦法不那么做。使用sp/dp會讓你的Android應用適應多種密度和分辨率。--Daniel Lew

 

關于Android中如何適應不同的屏幕大小及分辨率,看了一些文章,其中比較經典的一個stackoverflow上的討論《Android手機上px,dp,dip和sp的區別》,下面讓我們看看dp和px的區別

先直觀地看看dp和px的顯示效果。

圖1.設置相同的px,界面元素在不同的屏幕密度下的表現

    從圖1中,我們可以看出,當屏幕的尺寸(用英寸來表示)相同時,在不同屏幕密度(density)下,用等大的像素來表示的時候,在低屏幕密度的屏幕上顯示得比較大(如上圖中的左側圖片),在高屏幕密度的屏幕上顯示得比較小(如上圖中的右側圖片)。

圖2.設置相同的dip,界面元素在不同的屏幕密度下的表現

     從圖2中,可以看出,在屏幕的尺寸相同時,而屏幕的密度不同是,界面元素在鋪在界面上的比例相同。這是因為圖2中界面元素的顯示單位用的是dip,它能夠根據屏幕密度自動調整界面元素的大小,讓界面元素以恰當的比例顯示在屏幕上。

注意:當兩塊屏幕的長和寬可以用相同的dip來表示的話,那么界面元素能夠按照屏幕密度自動拉伸到恰當的大小,但是如果兩塊屏幕的長寬不能用相同的dip元素來表示的話,那么界面雖然會根據屏幕密度拉伸,但是拉伸的比例也不會正確。因為根據dip、屏幕密度進行拉伸的原理,其實是長或寬的dip數乘以屏幕密度進而得到正確的像素(pixels),因為最終要顯示到屏幕上的時候,必須要將界面顯示的單位落實到像素(pixels)上,只是Android系統自動幫我們完成了這個轉換的工作。

dp(dip)是什么

dp(或dip)的全稱是Density-independent Pixels(密度獨立像素) 。dp是一個抽象單位,建立在屏幕的物理密度上。這些單位都是相對于一個160 dpi(dots per inch 每英寸擁有的點數)屏幕,上面1 dp幾乎等于1 px。當運行在更高密度的屏幕上,原先描繪1dp的像素需要根據一個合適的比例擴大到一定的數量,以便適合屏幕的dpi。同樣,當在一個低密度屏幕,用來顯示1dp的像素需要按比例縮小一定的數量。dp轉化成pixe的比率會隨著屏幕的密度改變,但不一定成正比。使用dp單位(而不是px)是一個簡單的解決方案,使得在你的布局(LayOut)中界面元素的大小,能根據不同的屏幕密度調整到適當的大小。換句話說,它提供了在不同的設備中,UI元素實際大小的一致性。

px是什么

Pixels(像素)——對應于實際的像素在屏幕上。這個單位是不建議使用的,因為界面可能需要顯示在多個設備中,每個設備可能有不同屏幕密度和屏幕上所有像素的數量可能更多或者更少。

什么時候用dip

當屏幕的長寬用dip表示時,長寬都是相同的話,那么就可以使用dip進行界面元素的大小的布局,Android會自動幫我們拉伸到合適的尺寸,但是,如果屏幕差異太大的話,那么用dip進行布局大小的限定還是會出現問題的。

 

示例代碼

參考鏈接

Supporting Multiple Screens

Android實用代碼七段(一)

Android屏幕密度(Density)和分辨率的關系

Android Density(密度)

Dimension

Difference between px, dp, dip and sp in Android?


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()