天天看點

android螢幕适配,除了使用dp,還可以使用比例

在android中為了适應不同分辨率的螢幕,引入了密度無關像素density-independent pixes,也就是dip,也可以簡寫為dp。之是以是與密度無關,是因為android為不同的密度提供了不同的scale值,比如mdpi的值為1,hdpi為1.5,xhdpi為2.這樣,如果使用相同的dp值,系統在轉換為px時,會使用dp*scale值,這樣得到的比例大家都相同,而比例相同了,也就意味着螢幕适配了。如480*800,4.0inch的螢幕,為hdpi。螢幕的一半可以用160dp表示,其px = 160 * 1.5 = 240px,恰好為480的一半。而320*640的 3.5inch的螢幕,為mdpi。螢幕的一半也是160dp,其px = 160 * 1 = 160px,恰好為320的一半。這樣dp就實作了不同螢幕的适配。

但是現在xhdpi的螢幕也很普遍,比如720*1280 4.5inch的螢幕,其scale值為2,是以整個螢幕為360dp,這樣與hdpi和mdpi就不太相同了,用dp表示比例就有些誤差了。不過這種誤差也是在可以接受的範圍之内。

上面所說的都是以螢幕寬度為基準,因為ui設計時也是盡量已寬度為基準,如果以高度為基準,dp值表示的比例就相差更大了。

而對于平闆很多情況下以高度作為标準。都是hdpi的平闆其寬高就更不一樣了。比如高度分别是1200和1600的平闆,都是hdpi。這就意味着如果是表示一半的高度,dp值分别為400dp和533,相差如此之大,是以用dp來布局顯然不再适用。

解決方法: 既然dp的引入其實就是為了用同一個dp值表示相同的比例,那麼我們其實可以直接用比例表示(dp的本質也是比例,隻不過scale的劃分無法面面俱到)。當然前提是不同的螢幕比例不能相差過大,比如橫屏和豎屏就無法通用,需要寫兩個layout

例如ui給一張設計圖,尺寸為2560 * 1920,其長寬比為4:3. 所有的标注均以該尺寸為準。這樣為了能夠通用這些标注,不必手動計算,可以定義如下個方法 private int px_x(float px) {//以寬度為基準計算x方向上的比例      return (int)(px / 2560 * mScreenHight); }

private int px_y(float px) {      return (int)(px / 1920* mScreenWidth); }

這樣在代碼中重新設定一下跟尺寸相關的屬性即可以保證相關内容可以适配到不同尺寸的螢幕上。

需要注意的是: 這樣寫的一個缺點就是無法再xml裡的layout中直接定義好布局。尤其是各個控件之間的距離。不過xml并非沒有用處,可以通過xml很友善的定義控件直接的相對位置,比如above,below等屬性,這樣在代碼中就不必重複定義了。可以通過 view.getLayoutParameters()方法擷取到布局屬性,然後覆寫與尺寸相關的内容即可。(注:不可以用new parameter()的方法,這樣會完全覆寫xml中的設定)