天天看點

安卓螢幕代碼适配螢幕心得px和dp;sp和dp選擇

特意想了解下dp這些機關的概念去發現更是淩亂 網上的說法太他嗎不一樣現在自己總結下子于是看到一些文章真實千奇百怪 

dp/dip (density-independent pixels)密度/裝置獨立像素,不同裝置有不同的顯示效果,這個和裝置硬體有關,一般我們為了支援WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。
           

2015年4月18日 20:02:15螢幕适配的一些心得:

1當用到listview或者scrollview這些可以滑動的布局時候直接設定一個dp大小就可以 反正可以滑動無關緊要

2最強方案 當布局設計很複雜比如上次做一個上下左右四個圖檔 中間一個圓形的圖檔 圓形的圖檔和上下左右隔一定距離實作一個圓圈.這就複雜.不管你

設定dp或者px最後在不同手機總是會有一些難看,于是乎xml檔案全部隻控制控件的位置,大小全部由代碼實作.根據UI給的圖檔的大小乘以目前裝置的大

小除以ui設計的分辨率 的比值(假如UI的設計圖是1280*720.ui給的某個圖檔是寬是100 高是200  那麼你先擷取裝置的分辨率加入是1920*1080 那麼這個

控件的大小高是 200*(1280/1920),寬就是100*(720/1080)這樣算出來的就算魅族16:10的螢幕也不會奇怪的現象)這樣任何裝置都能保持占用螢幕比值

不變..任何複雜的布局都推薦這個方法

3,sp和dp 雖然谷歌推薦sp設定文字,很多人也多是用sp設定文字去了,但是仔細想想谷歌為什麼推薦用sp呢? 可以實作使用者自己設定圖檔大小.

谷歌肯定希望自己的手機能有讓使用者設定字型大小這麼一個功能不然又不是會被某某水果抨擊.但是站在開發者上這樣真的合适嗎.預設下sp使用者可以在

系統上sp和dp是相等的 但是使用者可以在設定系統設定字型大小這樣sp設定的字型就會相應的變大變小.然而你button寫的16sp可能已經超過一個控件的

大小而溢出邊界這是老闆找的肯定是你的錯 ,這樣是否可以考慮設定dp大小的文字.呢?

1  一般文字内容浏覽的地方還是設定sp因為這個一般不會讓你的文字過大過小在控件中顯得尴尬hui

2 對于button這樣的按鈕上的文字 都是文字不多 或者是導航欄actionbar這些文字少.包裹文字的控件的字型放大縮小會導緻界面的不協調這時候可以

用dp當然如果你控件大小用px設定 字型也就用px  ;dp設定的字型也用dp 抱枕字型不溢出達到美觀效果. 

最後強烈推薦xml設定和代碼混合設定的方法.布局複雜的地方用代碼控制大小 .xml控制每個控件的位置關系

首先說下 dip和dpi 和dp:前人不見解釋的;

dpi:螢幕的實體尺寸寬高為1.5英寸x2英寸,螢幕分辨率為240x320,則我們可以計算出在這部手機的螢幕上,每英寸包含的像素點的數量為240/1.5=160dpi(橫向)或320/2=160dpi(縱向),160dpi就是這部手機的像素密度,像素密度的機關dpi是Dots Per Inch的縮寫,即每英寸像素數量。

dp就是dip 就是 dpi/160;比如以上玻璃就是160/160就是剛好1 ;dp=1;dip=1;

一:dp現在還是不知道叫啥 但是的确和dip是一樣 (看到有些論壇說dp和裝置密度無關 dip和密度有關最後總結說 dp和dip一樣 淩亂了我.....)這個意思就是一英寸玻璃裡面裝了多少像素(px).谷歌說裝160個像素的是标準的就是密度1 ,320像素的超高的就是密度2 ,就像溫度機關一樣 攝先生說水結冰的溫度就是零度 沸點就是一百度,其他自己等分的算。結果華先生淩亂了..

二:dp和螢幕密度是有關的,(很多文章都說無關 好吧去的他蛋蛋..也沒有找到有關的到底和那些有關。。。。) 無關可以但是必須有前提: 比如兩快大小 同樣是4寸且 寬高比為 一樣 16:9 ,一個480*800 一個 320*480 這樣你設定160dp發現 他們的長度是一樣的,那麼這個和螢幕密度無關是不是說螢幕尺寸一樣,寬高比列相同就可能了?還是  不行。....假如上面兩塊玻璃前面不變。分辨率一個是 480*800 一個300*480,發現長度又變了。 不要說沒這個螢幕 隻是舉個列子 市場證明螢幕分辨率奇葩的确實很多估計菊花一緊了,出現這個原因很簡單 安卓 在你設定dp的時候最終會轉換乘分辨率來設定大小也就是 dp大小乘以螢幕密度density/160=px像素了。但是個density并不是你螢幕的真真的密度 ,因為谷歌隻把螢幕劃分出四個,等級低密度(<=0.75) 普通(1) 密度,高(1.5),超高 (=>2)我看到一

個列子來證明這一點:如果真實密度去計算把dp轉換px那麼G7橫向是480分辨率.密度是252這樣的話310dp* (252 / 160) = 488已經滿屏事實不是如此:

G7的真實dpi是252,根據我以前的了解,310dp換算成px應該是:310 * (252 / 160) = 488像素,而G7水準方向是480px,310dp在這上面絕對滿屏都不止了,

肯定滿屏了..事實上Android系統并沒有拿252作為dpi來計算,而是将G7視 作hdpi裝置,然後使用240dpi來計算最終像素,

是以在G7上320dp剛好是:320 * (240 / 160) = 480像素才能剛好滿屏了,310dp确實要差一點點。

這是别人一個列子證明不是真實密度去換算自然以上我說的.那麼到底要怎麼才能說是和裝置密度無關呢:

1,尺寸相同  2,寬高比列一樣  3,密度比是(0.75,1,1.5,2)這的一種不然安卓就會粗略計算 比如1.4的直接劃分在1.5也就變了。馬蛋就這樣不負責我說出

一個密度無關,這麼一大堆前提 此時大吼一聲fuck!

二 總結一些問題 比如一個螢幕到底多少dp是滿屏 ?試試證明不同的螢幕尺寸就會不同的dp值滿屏 不如5.5寸 1280*720的16:9螢幕

x^2+(x*9/16)^2=5.5^2算出來這塊玻璃長寬是多少,再相乘得到面積 (提醒下這個5.5不是面積而是螢幕對角線的長度,)用分辨率除以

面積可以得到密度我沒計算但是肯定得到的320,安卓了為了友善将160定義為标準的1那麼 320就是2,我們一般說這個螢幕密度就是2了

當然一般直接在手機上測試一下既可以得到各種螢幕資訊了不可能傻到自己去計算了呵呵呵~

DisplayMetrics dia = new DisplayMetrics();
		getWindow().getWindowManager().getDefaultDisplay().getMetrics(dia);
           

那麼這個螢幕橫向是計算公式是這樣的dp=px/ (密度/160)那麼720px密度是2也就是說720/(320/160)=360dp 實際怎麼360dp這塊螢幕剛好滿屏

因為别人說都會說螢幕密度比是2很少說是密度是320,一般直接用密度比dp=px/密度比;這樣你就知道了吧 看看不同的螢幕确實不同的dp才滿屏.

三在總結一點:兩個密度相同的玻璃都是2設定相同的px比較發現長度不一樣,(這裡兩個螢幕本身确實都是2不是說一個1.8一個2.1谷歌劃分到2的)

這個測試了一下的确。按照道理來說,密度相同就是一英寸能裝的像素相等,那麼同樣160px在密度相同的螢幕都是160px*(1/160)=1英寸呀?why?

有淩亂了..但是結果發現

DisplayMetrics dia = new DisplayMetrics();
		getWindow().getWindowManager().getDefaultDisplay().getMetrics(dia);
		this.density = dia.density;
		<span style=" line-height: 25.1875px; background-color: rgb(240, 240, 240); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; white-space: nowrap;"><strong>float </strong></span><span style=" line-height: 25.1875px; background-color: rgb(240, 240, 240); font-size: 14px; white-space: nowrap; font-family: Helvetica, Tahoma, Arial, sans-serif;"><strong>dh = dia.ydpi;</strong></span><h5><div style="POSITION: relative; WORD-WRAP: break-word; MARGIN-LEFT: 20px; PADDING-TOP: 2px"><a target=_blank target="_blank" href="eclipse-open:%E2%98%82=example_pahn/src%3Ccom.yung7086.pahn%7BExample_pahnActivity.java%E2%98%83Example_pahnActivity%5Edh" target="_blank" rel="external nofollow" ><img style="BORDER-BOTTOM: medium none; POSITION: absolute; BORDER-LEFT: medium none; WIDTH: 16px; HEIGHT: 16px; BORDER-TOP: medium none; BORDER-RIGHT: medium none; LEFT: -21px" alt="Open Declaration" src="file:/C:/Documents%20and%20Settings/Administrator/桌面/eclipse1/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png" /></a></div></h5>
           

兩個螢幕一個 dia.ydpi  是290一個dh是268;我把另一個乘以268/290.0這樣他娘的還一樣長,問題來了 為何密度是2 長寬的密度xdpi和ydpi去不同?好吧應該

是xdpi和ydpi是線性的 我們要的面型的 x乘以y才是面呢.我也不太懂了。。。留着在更新吧

螢幕适配在寫....

就寫在這裡吧一些心得:

1當用到listview或者scrollview這些可以滑動的布局時候直接設定一個dp大小就可以 反正可以滑動無關緊要

2最強方案 當布局設計很複雜比如上次做一個上下左右四個圖檔 中間一個圓形的圖檔 圓形的圖檔和上下左右隔一定距離實作一個圓圈.這就複雜.不管你設定dp或者px最後

最後在不同手機總是會有一些難看,于是乎xml檔案全部隻控制控件的位置,大小全部由代碼實作.根據UI給的圖檔的大小乘以目前裝置的大小除以ui設計的分辨率 的比值

這樣任何裝置都能保持占用螢幕比值不變..任何複雜的布局都推薦這個方法

3,sp和dp 雖然谷歌推薦sp設定文字,很多人也多是用sp設定文字去了,但是仔細想想谷歌為什麼推薦用sp呢? 可以實作使用者自己設定圖檔大小.谷歌肯定希望

自己的手機能有讓使用者設定字型大小這麼一個功能不然又不是會被某某水果抨擊.但是站在開發者上這樣真的合适嗎.預設下sp使用者可以在系統上sp和dp

是相等的 但是使用者可以在設定系統設定字型大小這樣sp設定的字型就會相應的變大變小.然而你button寫的16sp可能已經超過一個控件的大小而溢出邊界

這是老闆找的肯定是你的錯 ,這樣是否可以考慮設定dp大小的文字.呢?

1  一般文字内容浏覽的地方還是設定sp因為這個一般不會讓你的文字過大過小在控件中顯得尴尬hui

2 對于button這樣的按鈕上的文字 都是文字不多 或者是導航欄actionbar這些文字少.包裹文字的控件的字型放大縮小會導緻界面的不協調這時候可以用dp

當然如果你控件大小用px設定 字型也就用px  ;dp設定的字型也用dp 抱枕字型不溢出達到美觀效果. 

最後強烈推薦xml設定和代碼混合設定的方法.布局複雜的地方用代碼控制大小 .xml控制每個控件的位置關系