一直以來別人經常問我,android的多屏幕適配到底是怎么弄,我也不知道如何講解清楚,或許自己也是挺迷糊。
以下得出的結論主要是結合官方文檔進行分析的https://developer.android.com/guide/practices/screens_support.html
android由於碎片化太嚴重,而導致市面上出現非常多的種類尺寸手機設備,當然也包括非常奇葩的分辨率手機。所以我們在布局的時候使用px作為單位顯然不能很好的做到多屏幕的適配。其實在官方文檔中有介紹一種解決多屏幕適配的問題的尺寸單位dp/dip(Density-independent pixel )
文檔中也給出了px和dp之間的關系表達式:px = dp * (dpi / 160) 其中dpi表示的是設備屏幕密度,不同的設備dpi可能不一致。
例如在一個dpi為240的設備屏幕中,1個dp等價於2個px,也就是一個dp長度下包含2個px,如果dp與px的倍數越大,屏幕看起來也就越清晰。
谷歌已經針對dpi進行了分類:
- A set of six generalized densities:
- ldpi (low) ~120dpi
- mdpi (medium) ~160dpi
- hdpi (high) ~240dpi
- xhdpi (extra-high) ~320dpi
- xxhdpi (extra-extra-high) ~480dpi
- xxxhdpi (extra-extra-extra-high) ~640dpi
上述表述可以看出他是一個區間的,並不是一個固定的值。
基於px和dp的關系式。假如在屏幕像素為800*1280,dpi為240的設備上,dp的總長度只有600dp
在屏幕像素為800*1280 ,dpi為320的設備上,dp的總長度只有400dp
以下是測試代碼,來驗證dp的實際長度
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <ImageView android:id="@+id/imageview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#f00" android:src="@drawable/ic_launcher" /> <ImageView android:layout_width="100dip" android:layout_height="40dip" android:src="#0f0" /> <ImageView android:layout_width="200dip" android:layout_height="40dip" android:src="#0fa" /> <ImageView android:layout_width="300dip" android:layout_height="40dip" android:src="#0ff" /> <ImageView android:layout_width="400dip" android:layout_height="40dip" android:src="#09f" /> </LinearLayout>
720*1280 320dpi 480*800 160dpi 480*800 240dpi
dp總長度為360dp dp的總長度為480dp dp的總長度為320dp
總結一
一般情況下如果屏幕分辨率和屏幕密度成一定比例的關系,那么不管分辨率多大,得出的dp總長度將會在一定的范圍內。那么使用dp作為單位將能很好的解決多分辨率適配的問題。
然而由於設備屏幕分辨率和屏幕密度並不是成一個固定的比例,所以全部用dp的寫,似乎不是很好。建議使用warp_content 和match_parent來配合使用。對於布局的高寬沒有明確限制的,盡量結合相對布局和權重來表示,這樣不管在什么分辨率下,界面的樣式不會錯亂。