天天看點

android螢幕适配dip,dpi,px,sp相關

螢幕适配幾乎是每個安卓開發界面子產品都會遇到的問題。曾經我的apk在自己面前幾個裝置運作正常,一到使用者那邊就各種問題,于是各種查資料,最終适配還算完美。下面就結合我自己的體會說說螢幕适配相關的問題。由于是個人見解,如有不對的地方還望各位指出,同時也希望我的總結能幫到一些遇到适配問題的朋友。

首先,說一下dpi,它是每英寸上的像素數或點數。sp,是用來設定字型大小的字型的縮放,dip,也就是dp,裝置獨立像素,這個和裝置的硬體有關。了解了大緻的概念後來看具體的使用。

安卓中擷取以上各個概念值的方法如下:

//擷取螢幕分辨率以及DPI
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		int width = dm.widthPixels;//擷取螢幕寬度 , 機關px 
		int height = dm.heightPixels;//擷取螢幕高度,機關px
		float dpi = dm.densityDpi;//擷取螢幕dpi ,(每英寸上的像素數或點數) 
		float percent = dm.density;//擷取螢幕像素與dip的比例
		float sp = dm.scaledDensity;//和sp相關,設定字型的大小
           

如果是xml中寫布局,系統會自動進入對應的drawable查找對應的圖檔,xml中設定的寬高最好用dp,這樣設定出來的值在不同分辨率的機器上對應的效果都是相同的。比如說:原本計劃設定的寬度在xml布局中是5dp,這個時候效果是最好的。如果在代碼中設定,就要用percent*5,這個時候的效果和布局中是一緻的,也就是布局加載時已經自動判斷了分辨率加載對應的效果。此處的percent是螢幕像素與dip的比例:

160dpi的裝置 1dip = 1px 

240dip的裝置 1dip = 1.5px  

如果某個布局,我們在xml中設定了具體的寬高或者距離值,用的是dp,這個時候需要動态的修改一個控件的大小,在代碼中設定。我們就要先擷取螢幕像素與dip的比例,也就是上面的percent,然後乘以具體的數值(本來打算在布局中寫的數值),就可以在不同裝置上得到我們想要的相同效果。注意,此處可以直接設定padding,但是對于寬度或者高度需要用layoutparams設定才有效。如下:

<span style="white-space:pre">	</span>LayoutParams params = new LinearLayout.LayoutParams((int) (percent*100), LayoutParams.WRAP_CONTENT);
	tv.setLayoutParams(params);
	tv.setPadding((int) (percent*15), 0, 0, 0);
           

這樣在xml中設定tv的寬度為100dp,paddingleft為15dp,和此處的效果相同,不同機器都可以适配。

我還遇到過一種在xml中寫布局後不同機器運作出來控件位置不同的情況,因為布局内的圖檔需要動态添加,而下面的輸入框大小又是恒定的,是以布局錯亂。最後我把整個布局都改成了動态布局,全部在代碼中寫出來,雖然比較麻煩但是可以解決适配問題。因為Android的機型實在是太多了,在xml中就算寫不同分辨率也不一定能走到對應的布局檔案中去,而在代碼中可以判斷當然機器大緻的寬高比,比如我當時用的就是螢幕的寬度和percent的比例,大于500是一種布局,小于500是另一種布局,都是動态添加,這樣基本解決了适配問題。一般480*800的機器寬比上percent的值都小于500,這種percent一般值為1,而一些分辨率比較高但是螢幕又比較小的機器,這個比例就超過了500,我的情況是目前的布局并不适合這種比例,是以就加載另一套布局,效果很好。

以上僅僅是個人總結,是自己開發中遇到的一些适配問題的記錄,希望可以幫到需要幫助的人。