在《iPhone屏幕分辨率和適配規(guī)則(基礎(chǔ)篇)》,《iPhone屏幕分辨率和適配規(guī)則(規(guī)則篇)》和《iPhone屏幕分辨率和視頻規(guī)則(實(shí)現(xiàn)篇)》中已經(jīng)介紹了iPhone的屏幕和適配的問題。這篇來講講Android的屏幕和適配的問題。
有些概念已經(jīng)在iPhone講過的,在這篇就不再介紹了,有興趣可以看看另外幾篇文章。
混亂的Andorid屏幕尺寸
相比于iPhone,Android的屏幕尺寸簡直能用混亂來形容。

這個(gè)是2014年8月份統(tǒng)計(jì)出來的Andorid支持的屏幕尺寸類型。毫無疑問,Android的適配比iOS的適配要艱巨得多。
常見單位
px
px(pixel)屏幕像素是屏幕實(shí)際的像素點(diǎn)。我們?nèi)粘Vv的屏幕分辨率則為屏幕的像素?cái)?shù)量。
dip/dp
dip/dp(Density Independent Pixels)是指設(shè)備的獨(dú)立像素,于屏幕像素?zé)o關(guān)像素。dip和dp是相同的概念。
1 dp = 1/160 inch
dip/dp的概念類似于iPhone中的pt的概念。當(dāng)我們要繪制100dp長度的控件時(shí),通過一定的換算關(guān)系,可以保證這個(gè)控件在不同屏幕分辨率下顯示的是一樣的大小。下文會(huì)講怎么換算,這里不展開。
dpi
dpi(dots per inch)每英寸上像素點(diǎn)數(shù)。這個(gè)于屏幕尺寸和屏幕分辨率有關(guān)。dpi越大,表示每英寸像素?cái)?shù)量越多,屏幕也越清晰。
dpi類似于iPhone的ppi的概念,其計(jì)算方式也是一致的。根據(jù)屏幕分辨率用勾股定理算出對(duì)角線像素的數(shù)量,然后除以對(duì)角線長度得出。
不同屏幕的分類
根據(jù)屏幕的dpi值不同,將屏幕分成了若干個(gè)等級(jí)。
| 類型 | dpi值 | 縮放比例 |
|---|---|---|
| mdpi | 120~160dpi | 2 |
| hdpi | 160~240dpi | 3 |
| xhdpi | 240~320dpi | 4 |
| xxhdpi | 320~480dpi | 6 |
| xxxhdpi | 480~640dpi | 8 |
早期還有l(wèi)dmp的分類,隨著屏幕的dpi越來越大,現(xiàn)在已經(jīng)不怎么支持了。
縮放比例
類似于iPhone的縮放因子。當(dāng)需要適配不同dpi的屏幕時(shí),需要提供不同像素大小的圖標(biāo)。

sp
sp(Scale-Independent pixels)獨(dú)立比例像素。sp是字體大小的單位,也是一個(gè)于屏幕實(shí)際像素?zé)o關(guān)的單位。
Google官方建議字體不應(yīng)該小于12sp,小于12sp不適合閱讀。正??砷喿x字體大小為12sp、14sp、18sp、22sp。
各個(gè)單位的換算關(guān)系
dpi是每英寸像素點(diǎn)數(shù)。當(dāng)屏幕為160dpi時(shí),也就是說像素密度為160px/inch。
而上文提到 1 dp = 1/160inch。所以當(dāng)屏幕為160dpi時(shí),1dp = 1px。
以此類推,當(dāng)屏幕為240dpi時(shí),1dp = 1.5px。
最終的換算關(guān)系為:
px = dp * dpi / 160
在開發(fā)過程中,我們使用的單位是dp,不同的設(shè)備根據(jù)屏幕dpi可以換算出不同的px進(jìn)行最終的顯示。
布局規(guī)則
線性布局(LinearLayout)
線性布局就是對(duì)一行或一列進(jìn)行布局,組件一個(gè)挨著一個(gè)排列起來。組件不會(huì)換行或換列,如果顯示不下時(shí),則超出部分不予顯示。

控件的適配方式
適配內(nèi)容
根據(jù)控件放在的內(nèi)容的大小決定控件大小??雌饋硐袷前鴥?nèi)容。

設(shè)置按鈕的高度(height)為適配內(nèi)容(wrap-content)。當(dāng)按鈕文字大小不一致時(shí),按鈕的高度會(huì)隨著內(nèi)容的變大而變大。
適配父控件
根據(jù)父控件的大小決定控件大小。

設(shè)置按鈕的寬度(width)為適配父控件(match-parent)。當(dāng)屏幕寬度變大時(shí),按鈕自動(dòng)隨著屏幕拉伸。
適配權(quán)重
當(dāng)同一行有多個(gè)控件都選擇了適配父控件時(shí)??梢愿鶕?jù)權(quán)重,等比的進(jìn)行縮放。

設(shè)置兩個(gè)按鈕的適配權(quán)重(weight)為1和2。按鈕將以1:2的寬度大小進(jìn)行顯示。當(dāng)屏幕拉伸時(shí),保持等比縮放。
相對(duì)布局(RelativeLayout)
相對(duì)布局可以設(shè)置控件和父控件、控件和控件之間的相對(duì)位置關(guān)系。
設(shè)置父控件的定位
- 左對(duì)齊/右對(duì)齊/頂對(duì)齊/底對(duì)齊
- 水平居中/垂直居中
- 中間位置
設(shè)置控件之間的定位
- 左距離/右距離/上距離/下距離
- 左對(duì)齊/右對(duì)齊/上對(duì)齊/下對(duì)齊

設(shè)置按鈕和父控件的距離,控件和控件之間的距離,以及水平對(duì)齊。當(dāng)屏幕變大之后,控件的相對(duì)位置不會(huì)改變。
其他布局
線性布局和相對(duì)布局是比較常見的布局。除了這兩個(gè),還有絕對(duì)布局(AbsoluteLayout)、表格布局(TableLayout)、網(wǎng)格布局(GridLayout)。
其中幀布局(FrameLayout)適配性比較差,已經(jīng)極少使用。表格布局(TableLayout)、網(wǎng)格布局(GridLayout)分別都有適用場景。
限定符
因?yàn)锳ndroid支持手機(jī)和平板電腦,而且就算是手機(jī),Android支持的屏幕尺寸大小和比例也相差很大。
有時(shí)候沒辦法以一套規(guī)則適配所有的手機(jī)尺寸。Android手機(jī)支持根據(jù)不同的設(shè)備進(jìn)行單獨(dú)的頁面設(shè)計(jì)。
Android是通過限定符的方式來進(jìn)行設(shè)備的匹配。
常見限定符
常見的限定符有:
| 分類 | 限定符 |
|---|---|
| 屏幕尺寸 | small、normal、large、xlarge |
| 屏幕方向 | port、land |
| 像素密度 | ldpi、mdpi、hdpi、xhdpi、nodpi、tvdpi |
也可以根據(jù)具體的像素來設(shè)置,例如設(shè)置layout-sw600dp,當(dāng)設(shè)備大于600dp時(shí),使用這個(gè)布局。
限定符的使用
限定符是通過文件名的方式進(jìn)行使用的。

例如,我們針對(duì)不同的屏幕有不同的圖片資源,這可以放在對(duì)應(yīng)的res/drawable文件里面。在res/drawable-hdpi文件放高分辨率的圖片資源,res/drawable-mdpi文件放低分辨率的圖片資源。當(dāng)設(shè)備是hdpi設(shè)備時(shí),程序會(huì)加載高分辨率的資源進(jìn)行顯示。
同理,如果我們針對(duì)不同的分辨率進(jìn)行不同的布局,這可以在res/layout文件夾里面放置不同的布局文件,如res/layout/layout-normal、res/layout/layout-large 等。