@[TOC](文章目錄)
成都創(chuàng)新互聯(lián)IDC提供業(yè)務(wù):四川服務(wù)器托管,成都服務(wù)器租用,四川服務(wù)器托管,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動(dòng)機(jī)房,聯(lián)通機(jī)房。
hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"
# 前言
font color=#999AAA 使用工具Android studio,利用values文件下dimens.xml界面適配安卓屏幕/font
hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"
font color=#999AAA 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
# 一、概念
1.屏幕分辨率單位是px,例如Android手機(jī)常見(jiàn)的分辨率:320x480px、480x800px、720x1280px、1080x1920px。
2.手機(jī)屏幕的密度:每英寸的像素點(diǎn)數(shù),單位是dpi。
| 密度類型 |代表的分辨率(px)| 屏幕像素密度(dpi) | 1dp轉(zhuǎn)換為px |
|:--------|:--------|:--------|:--------|
| 低密度(ldpi) |240x320|120|0.75|
| 中密度(mdpi) |320x480|160|1|
| 高密度(hdpi)|480x800|240| 1.5|
| 超高密度(xhdpi)|720x1280|320|2|
| 超超高密度(xxhdpi) |1080x1920|480|3|
3.由于android的機(jī)型屏幕大小品類太多了,有一些是不標(biāo)準(zhǔn)的,這時(shí)我們就需要單獨(dú)去獲取屏幕的分辨率和密度了。
# 二、獲取屏幕的分辨率和密度
```java
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float density = displayMetrics.density;
int densityDpi = displayMetrics.densityDpi;
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
Log.e("123","密度:"+density+"---"+densityDpi);
Log.e("123","屏幕分辨率:"+width+"x"+height);
Log.e("123","安卓系統(tǒng):"+android.os.Build.VERSION.RELEASE);
Log.e("123","手表型號(hào):"+android.os.Build.PRODUCT);
```
# 三、SmallestWidth適配
**smallestWidth適配,或者叫sw限定符適配。指的是Android會(huì)識(shí)別屏幕可用高度和寬度的最小尺寸的dp值(其實(shí)就是手機(jī)的寬度值),然后根據(jù)識(shí)別到的結(jié)果去資源文件中尋找對(duì)應(yīng)限定符的文件夾下的資源文件。**
**sw計(jì)算公式:sw = 屏幕寬度 / (dpi/160)? 注:160是默認(rèn)的**
**例如:屏幕寬度為1080px、480dpi 的sw = 1080/(480/160)**
# 四、生成 dimens 文件
1、 首先在 res 目錄下新建各種尺寸的 values 文件 。文件名為:values-sw(你要適配屏幕的sw值)dp。
例如:
![code23]()
注意:values文件下也生成 dimens文件
**生成dimens值工具類**
1、先生成標(biāo)準(zhǔn)的值。//value = (i + 1) * 1;
2、再用生成其他的值。 //value = (i + 1) * 需要生成的sw值/標(biāo)準(zhǔn)的sw值;
例如:value = (i + 1) * 160 / 320;
```java
public static void genDimen() {
? ? StringBuilder stringBuilder = new StringBuilder();
? ? try {
? ? ? ? double value;
? ? ? ? for (int i = 0; i 500; i++) {
? ? ? ? ? //value = (i + 1) * 1; //這里控制對(duì)應(yīng)轉(zhuǎn)換的值,如果是標(biāo)準(zhǔn)尺寸就一對(duì)一轉(zhuǎn)換
? ? ? ? ? ? //value = (i + 1) * 需要生成的sw值/標(biāo)準(zhǔn)的sw值; //這里控制對(duì)應(yīng)轉(zhuǎn)換的值
value = (i + 1) * 1
? ? ? ? ? ? //value = (i + 1) * 160 / 320;
? ? ? ? ? ? value = Math.round(value * 100) / 100;
//dp可改成sp
? ? ? ? ? ? stringBuilder.append("dimen name=\"size_" + (i + 1) + "\"" + value + "dp/dimen\r\n");
? ? ? ? }
? ? ? ? if (stringBuilder.length() 4000) {
? ? ? ? ? ? for (int i = 0; i stringBuilder.length(); i += 4000) {
? ? ? ? ? ? ? ? if (i + 4000 stringBuilder.length())
? ? ? ? ? ? ? ? ? ? Log.e("123", stringBuilder.substring(i, i + 4000));
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? Log.e("123", stringBuilder.substring(i, stringBuilder.length()));
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? Log.e("123", stringBuilder.toString());
? ? ? ? }
? ? } catch (Exception e) {
? ? ? ? e.printStackTrace();
? ? } finally {
? ? }
}
```
示例:(我這是以sw320為適配的標(biāo)準(zhǔn)的,你們可改自己的標(biāo)準(zhǔn))
1、sw320的樣例
```java
resources
dimen name="dimen_1"1.0dp/dimen
dimen name="dimen_2"2.0dp/dimen
dimen name="dimen_3"3.0dp/dimen
dimen name="dimen_4"4.0dp/dimen
dimen name="dimen_5"5.0dp/dimen
dimen name="dimen_6"6.0dp/dimen
dimen name="dimen_7"7.0dp/dimen
dimen name="dimen_8"8.0dp/dimen
dimen name="dimen_9"9.0dp/dimen
dimen name="dimen_10"10.0dp/dimen
dimen name="size_1"1.0sp/dimen
dimen name="size_2"2.0sp/dimen
dimen name="size_3"3.0sp/dimen
dimen name="size_4"4.0sp/dimen
dimen name="size_5"5.0sp/dimen
dimen name="size_6"6.0sp/dimen
dimen name="size_7"7.0sp/dimen
dimen name="size_8"8.0sp/dimen
dimen name="size_9"9.0sp/dimen
dimen name="size_10"10.0sp/dimen
/resources
```
2、sw160的樣例
```java
resources
dimen name="dimen_1"0.0dp/dimen
dimen name="dimen_2"1.0dp/dimen
dimen name="dimen_3"1.0dp/dimen
dimen name="dimen_4"2.0dp/dimen
dimen name="dimen_5"2.0dp/dimen
dimen name="dimen_6"3.0dp/dimen
dimen name="dimen_7"3.0dp/dimen
dimen name="dimen_8"4.0dp/dimen
dimen name="dimen_9"4.0dp/dimen
dimen name="dimen_10"5.0dp/dimen
dimen name="size_1"0.0sp/dimen
dimen name="size_2"1.0sp/dimen
dimen name="size_3"1.0sp/dimen
dimen name="size_4"2.0sp/dimen
dimen name="size_5"2.0sp/dimen
dimen name="size_6"3.0sp/dimen
dimen name="size_7"3.0sp/dimen
dimen name="size_8"4.0sp/dimen
dimen name="size_9"4.0sp/dimen
dimen name="size_10"5.0sp/dimen
/resources
```
3、xml界面控件使用樣例
```java
TextView
? ? android:layout_width="@dimen/dimen_30"
? ? android:layout_height="@dimen/dimen_30"
? ? android:textSize="@dimen/size_20"
? ? android:layout_margin="@dimen/dimen_10"
? ? android:padding="@dimen/dimen_10"
```
hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1"
# 總結(jié)
font color=#999999 提示:這里對(duì)文章進(jìn)行總結(jié):
如果你的app需要適配dpi較低的屏幕,最好以最小dpi的sw為適配的標(biāo)準(zhǔn)。
關(guān)鍵字: 屏幕適配 px dp dpi sp large限定符 .9.png
前言: 這篇文章依然是我在 [慕課網(wǎng) ][h]學(xué)習(xí) 凱子哥 的同名視頻 Android-屏幕適配全攻略 ,所記錄下來(lái)的筆記---凱子哥講得真的超詳細(xì)。
[h]: "MOOC"
從上圖可以看出,主流的分辨率是前六種:1280×720、1920×1080、800×480、854×480、960×540、1184×720,不過(guò)我們有解決方案??赐赀@篇文章,想必你就可以解決常見(jiàn)的屏幕適配問(wèn)題。
接下來(lái)正式進(jìn)入正題。
介紹幾個(gè)在Android屏幕適配上非常重要的名詞:
屏幕尺寸 是指屏幕對(duì)角線的長(zhǎng)度。單位是英寸,1英寸=2.54厘米
屏幕分辨率 是指在橫縱向上的像素點(diǎn)數(shù),單位是px,1px=1像素點(diǎn),一般是縱向像素橫向像素,如1280×720
屏幕像素密度 是指每英寸上的像素點(diǎn)數(shù),單位是dpi,即“dot per inch”的縮寫,像素密度和屏幕尺寸和屏幕分辨率有關(guān)
dip: Density Independent Pixels(密度無(wú)關(guān)像素)的縮寫。以 160dpi 為基準(zhǔn),1dp=1px
dp: 同 dip
dpi: 屏幕像素密度的單位,“dot per inch”的縮寫
px: 像素,物理上的絕對(duì)單位
sp: Scale-Independent Pixels的縮寫,可以根據(jù)文字大小首選項(xiàng)自動(dòng)進(jìn)行縮放。Google推薦我們使用12sp以上的大小,通??梢允褂?2sp,14sp,18sp,22sp,最好不要使用奇數(shù)和小數(shù)。
用于區(qū)分不同的像素密度。
在Google官方開(kāi)發(fā)文檔中,說(shuō)明了 ** mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 ** 的尺寸比例進(jìn)行縮放。例如,一個(gè)圖標(biāo)的大小為48×48dp,表示在mdpi上,實(shí)際大小為48×48px,在hdpi像素密度上,實(shí)際尺寸為mdpi上的1.5倍,即72×72px,以此類推。
我們可以通過(guò)以下幾種方式來(lái)支持各種屏幕尺寸:
wrap_content: 根據(jù)控件的內(nèi)容設(shè)置控件的尺寸
math_parent: 根據(jù)父控件的尺寸大小設(shè)置控件的尺寸
weight: 權(quán)重,在線性布局中可以使用weight屬性設(shè)置控件所占的比例
例如,我們要實(shí)現(xiàn)下圖所顯示的效果:當(dāng)屏幕尺寸改變時(shí),new reader控件兩邊的控件大小不變,new reader控件會(huì)占完剩余的空間。
具體布局文件如下:
小插曲: 關(guān)于 android:layout_weight 屬性
一般情況,我們都是設(shè)置要進(jìn)行比例分配的方向的寬度為0dp,然后再用權(quán)重進(jìn)行分配。如下:
效果為:
效果為:
button1寬度=L+(L-2L)×1/3=2/3L
button2寬度=L+(L-2L)×2/3=1/3L
當(dāng)然,還有其他的方式,都可以運(yùn)用此公式進(jìn)行計(jì)算。
在實(shí)際開(kāi)發(fā)中,我們一般使用0dp的方式,而不使用其他方式。
簡(jiǎn)單的布局一般都使用 線性布局 ,而略微復(fù)雜點(diǎn)的布局,我們使用 相對(duì)布局 ,大多數(shù)時(shí)候,我們都是使用這兩種布局的嵌套。
我們使用 相對(duì)布局 的原因是, 相對(duì)布局 能在各種尺寸的屏幕上保持控件間的相對(duì)位置。
res/layout/main.xml 單面板:
res/layout-large/main.xml 雙面板:
如果這個(gè)程序運(yùn)行在屏幕尺寸大于7inch的設(shè)備上,系統(tǒng)就會(huì)加載 res/layout-large/main.xml 而不是 res/layout/main.xml ,在小于7inch的設(shè)備上就會(huì)加載 res/layout/main.xml 。
需要注意的是,這種通過(guò) large 限定符分辨屏幕尺寸的方法,適用于android3.2之前。在android3.2之后,為了更精確地分辨屏幕尺寸大小,Google推出了最小寬度限定符。
res/layout-sw600dp/main.xml ,雙面板布局: Small Width 最小寬度
這種方式是不區(qū)分屏幕方向的。這種最小寬度限定符適用于android3.2之后,所以如果要適配android全部的版本,就要使用 large 限定符和 sw600dp 文件同時(shí)存在于項(xiàng)目 res 目錄下。
這就要求我們維護(hù)兩個(gè)相同功能的文件。為了避免繁瑣操作,我們就要使用布局別名。
由于后兩個(gè)文具文件一樣,我們可以用以下兩個(gè)文件代替上面三個(gè)布局文件:
res/layout/main.xml 單面板布局
res/layout/main_twopanes.xml 雙面板布局
然后在 res 下建立
res/values/layout.xml 、
res/values-large/layout.xml 、
res/values-sw600dp/layout.xml 三個(gè)文件。
默認(rèn)布局
res/values/layout.xml :
Android3.2之前的平板布局
res/values-large/layout.xml :
Android3.2之后的平板布局
res/values-sw600dp/layout.xml :
這樣就有了 main 為別名的布局。
在activity中 setContentView(R.layout.main);
這樣,程序在運(yùn)行時(shí),就會(huì)檢測(cè)手機(jī)的屏幕大小,如果是平板設(shè)備就會(huì)加載 res/layout/main_twopanes.xml ,如果是手機(jī)設(shè)備,就會(huì)加載 res/layout/main.xml 。我們就解決了只使用一個(gè)布局文件來(lái)適配android3.2前后的所有平板設(shè)備。
如果我們要求給橫屏、豎屏顯示的布局不一樣。就可以使用 屏幕方向限定符 來(lái)實(shí)現(xiàn)。
例如,要在平板上實(shí)現(xiàn)橫豎屏顯示不用的布局,可以用以下方式實(shí)現(xiàn)。
res/values-sw600dp-land/layouts.xml :橫屏
res/values-sw600dp-port/layouts.xml :豎屏
自動(dòng)拉伸位圖,即android下特有的 .9.png 圖片格式。
當(dāng)我們需要使圖片在拉伸后還能保持一定的顯示效果,比如,不能使圖片中的重要像素拉伸,不能使內(nèi)容區(qū)域受到拉伸的影響,我們就可以使用 .9.png 圖來(lái)實(shí)現(xiàn)。
要使用 .9.png ,必須先得創(chuàng)建 .9.png 圖片,androidSDK給我們提供了的工具就包含 .9.png 文件的創(chuàng)建和修改工具。雙擊 SDK安裝目錄 oolsdraw9patch.bat ,就會(huì)打開(kāi)下圖所示的窗口。
下面是一個(gè)例子:
Button屬性設(shè)置:
如果我們選擇的內(nèi)容區(qū)域偏差太大,可能就不會(huì)顯示出text值 BUTTON 。
好了,這篇文章寫的有點(diǎn)多了,剩下的內(nèi)容放在 下篇文章 記錄吧。
內(nèi)容提要:
解決方案-支持各種屏幕密度
解決方案-實(shí)施自適應(yīng)用戶界面流程
未完待續(xù)
摘自:
摘自:
摘自:
因?yàn)閡i設(shè)計(jì)師給你的設(shè)計(jì)圖是以px為單位的,Android開(kāi)發(fā)則是使用dp作為單位的,那么我們需要進(jìn)行轉(zhuǎn)換:
擴(kuò)展:
Android屏幕適配-基礎(chǔ)篇
?? Android推薦使用dp作為尺寸單位來(lái)適配UI ,通過(guò)dp加上自適應(yīng)布局和weight比例布局可以基本解決不同手機(jī)上適配的問(wèn)題,這基本是最原始的Android適配方案。
?? 缺點(diǎn):
??(1)這種方案只能保證我們寫出來(lái)的界面適配絕大部分手機(jī),部分手機(jī)仍然需要單獨(dú)適配,但dpi的不同,還是會(huì)存在差異。
??(2)一般的設(shè)計(jì)稿都是以px為單位的,所以我們?cè)趯憀ayout文件的時(shí)候需要將px轉(zhuǎn)為dp,影響開(kāi)發(fā)效率。
??為了高效的實(shí)現(xiàn)UI開(kāi)發(fā),出現(xiàn)了新的適配方案,我把它稱作寬高限定符適配。簡(jiǎn)單說(shuō),就是模仿市面上所有的Android手機(jī)的寬高像素值,設(shè)定一個(gè)基準(zhǔn)的分辨率,其他分辨率都根據(jù)這個(gè)基準(zhǔn)分辨率來(lái)計(jì)算,在不同的尺寸文件夾內(nèi)部,根據(jù)該尺寸編寫對(duì)應(yīng)的dimens文件:
?? 鴻洋大神的作品 ,使用也超級(jí)簡(jiǎn)單,核心功能就是在繪制的時(shí)候在onMeasure里面做變換,重新計(jì)算px。
?? 缺點(diǎn):
??我們自定義的控件可能會(huì)被影響或限制,可能有些特定的控件(框架沒(méi)有做適配的控件),需要單獨(dú)適配。
小結(jié):上述幾種適配方案都是實(shí)際開(kāi)發(fā)中用過(guò)的方案,但隨著技術(shù)不斷的更新,出現(xiàn)了更好的適配方案。
?? 1.SmallestWidth適配(sw限定符適配)
?? 實(shí)現(xiàn)原理:
??Android會(huì)識(shí)別屏幕可用高度和寬度的最小尺寸的dp值(其實(shí)就是手機(jī)的寬度值),然后根據(jù)識(shí)別到的結(jié)果去資源文件中尋找對(duì)應(yīng)限定符的文件夾下的資源文件。
?? sw限定符適配 和 寬高限定符適配 類似,區(qū)別在于,前者有很好的容錯(cuò)機(jī)制,如果沒(méi)有value-sw360dp文件夾,系統(tǒng)會(huì)向下尋找,比如離360dp最近的只有value-sw350dp,那么Android就會(huì)選擇value-sw350dp文件夾下面的資源文件。這個(gè)特性就完美的解決了上文提到的寬高限定符的容錯(cuò)問(wèn)
?? 優(yōu)點(diǎn):
????1.非常穩(wěn)定,極低概率出現(xiàn)意外
????2.不會(huì)有任何性能的損耗
????3.適配范圍可自由控制,不會(huì)影響其他三方庫(kù)
?? 缺點(diǎn):
????就是多個(gè)dimens文件可能導(dǎo)致apk變大,幾百k。
????這里有個(gè)問(wèn)題:
????在項(xiàng)目的其他 module 中怎么實(shí)現(xiàn)適配?難道也要多套 dimens 文件?
????解答:
????并不需要多套 dimens 文件,只需要在 values 文件夾下有一套與 app module 一樣的 dimens 文件即可達(dá)到適配。因?yàn)榻?jīng)過(guò)編譯,所有 module 中的 dimen 數(shù)據(jù)都會(huì)統(tǒng)一歸類到主 module(即 app module)中的 values/dimens.xml 文件中了,然后系統(tǒng)又會(huì)根據(jù)你設(shè)置的值去找對(duì)應(yīng) values-swxxxdp 文件夾下的dimens.xml 文件中的值。
附件: [生成sw文件的工具]( ?
to=https%3A%2F%2Fgithub.com%2Fladingwu%2Fdimens_sw)
實(shí)現(xiàn)原理:修改系統(tǒng)的density值(核心)
??今日頭條適配是以設(shè)計(jì)圖的寬或高進(jìn)行適配的,適配最終是改變系統(tǒng)density實(shí)現(xiàn)的。
過(guò)程:
缺點(diǎn):
?? 1.只需要修改一次 density,項(xiàng)目中的所有地方都會(huì)自動(dòng)適配,這個(gè)看似解放了雙手,減少了很多操作,但是實(shí)際上反應(yīng)了一個(gè)缺點(diǎn),那就是只能一刀切的將整個(gè)項(xiàng)目進(jìn)行適配,但適配范圍是不可控的。
?? 2.這個(gè)方案依賴于設(shè)計(jì)圖尺寸,但是項(xiàng)目中的系統(tǒng)控件、三方庫(kù)控件、等非我們項(xiàng)目自身設(shè)計(jì)的控件,它們的設(shè)計(jì)圖尺寸并不會(huì)和我們項(xiàng)目自身的設(shè)
??AndroidAutoSize 是基于今日頭條適配方案,該開(kāi)源庫(kù)已經(jīng)很大程度上解決了今日頭條適配方案的兩個(gè)缺點(diǎn),可以對(duì)activity,fragment進(jìn)行取消適配。也是目前我的項(xiàng)目中所使用的適配方案。
?? 使用也非常簡(jiǎn)單只需兩步:
???? 第一步: 導(dǎo)入依賴
???? 第二步: 配置AndroidManifest
???? 在 AndroidManifest 中填寫全局設(shè)計(jì)圖尺寸 (單位 dp),如果使用副單位,則可以直接填寫像素尺寸,不需要再將像素轉(zhuǎn)化為 dp,詳情請(qǐng)查看 demo-subunits
老師給的UI設(shè)計(jì)是在藍(lán)湖上的,因?yàn)檫€沒(méi)工作,接觸就藍(lán)湖,SW個(gè)人感覺(jué)好處就是藍(lán)湖上尺寸多少你就寫多少就行
分辨率對(duì)應(yīng)DPI
ldpi? QVGA (240×320)
mdpi? HVGA (320×480)
hdpi? WVGA (480×800),FWVGA (480×854)
xhdpi? 720P(1280*720)
xxhdpi 1080p(1920*1080 )
xxxhdpi 4K(3840×2160)
機(jī)型適配方面常規(guī)處理方法:
1、開(kāi)發(fā)之前UI給出不同尺寸標(biāo)準(zhǔn)的多套素材,一般情況下給出:hdpi、xhdpi、xxxhdpi 三種尺寸類型的素材。
2、特殊類型圖片使用Android Studio內(nèi)置draw9path工具進(jìn)行制作,例如聊天界面中內(nèi)容背景圖片。
3、布局編寫時(shí)盡量使用 Linearlayout 與 ?RelativeLayout,LinearLayout內(nèi)部可以使用weight(權(quán)重)屬性將子控件的尺寸按比例進(jìn)行設(shè)置。RelativeLayout 內(nèi)部可以使用layout_align...(相對(duì)于xxx)屬性將子控件的尺寸相對(duì)于父控件或相對(duì)于其他子控件進(jìn)行設(shè)置。
4、設(shè)置尺寸的時(shí)候長(zhǎng)度單位 ?布局使用 dp ?字符使用 ?sp。 其實(shí)字體大小的尺寸使用 ?dp 也可以,但是sp的情況下 用戶使用系統(tǒng)設(shè)置字體大小的時(shí)候可以改變控件中字體的大小,但是使用dp設(shè)置的字體就不會(huì)產(chǎn)生變化。
5、針對(duì)每一個(gè)屏幕的尺寸生成一套px與dp的轉(zhuǎn)換方案,詳情見(jiàn)博客: Android機(jī)型適配方案 。
6、google推出了一個(gè)百分比布局庫(kù),可以使用百分比的方式進(jìn)行布局尺寸的設(shè)置,詳情見(jiàn)博客: Android百分比布局庫(kù)(percent-support-lib)解析與擴(kuò)展
7、利用自定義View的方式去解決,其實(shí)原理也是,在繪制View的時(shí)候,獲取屏幕的尺寸然后按照一定的比例去設(shè)置控件的尺寸
還有一些瑣碎知識(shí)點(diǎn)需要了解并記?。?/p>
1. px (pixels)像素 :
一個(gè)像素通常被視為圖像的最小的完整采樣,這個(gè)用的比較多,特別是web開(kāi)發(fā),頁(yè)面基本都是使用像素作為單位的.
2.dp:
這個(gè)是最常用但也最難理解的尺寸單位。它與“像素密度”密切相關(guān),所以首先我們解釋一下什么是像素密度。假設(shè)有一部手機(jī),屏幕的物理尺寸為1.5英寸x2英寸,屏幕分辨率為240x320,則我們可以計(jì)算出在這部手機(jī)的屏幕上,每英寸包含的像素點(diǎn)的數(shù)量為240/1.5=160dpi(橫向)或320/2=160dpi(縱向),160dpi就是這部手機(jī)的像素密度,像素密度的單位dpi是Dots Per Inch的縮寫,即每英寸像素?cái)?shù)量。橫向和縱向的這個(gè)值都是相同的,原因是大部分手機(jī)屏幕使用正方形的像素點(diǎn)。
不同的手機(jī)/平板可能具有不同的像素密度,例如同為4寸手機(jī),有480x320分辨率的也有800x480分辨率的,前者的像素密度就比較低。Android系統(tǒng)定義了四種像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它們對(duì)應(yīng)的dp到px的系數(shù)分別為0.75、1、1.5和2,這個(gè)系數(shù)乘以dp長(zhǎng)度就是像素?cái)?shù)。例如界面上有一個(gè)長(zhǎng)度為“80dp”的圖片,那么它在240dpi的手機(jī)上實(shí)際顯示為80x1.5=120px,在320dpi的手機(jī)上實(shí)際顯示為80x2=160px。如果你拿這兩部手機(jī)放在一起對(duì)比,會(huì)發(fā)現(xiàn)這個(gè)圖片的物理尺寸“差不多”。
3.dip:
與dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后來(lái)為了與sp統(tǒng)一就建議使用dp這個(gè)名字了。
4.sp:
與縮放無(wú)關(guān)的抽象像素(Scale-independent Pixel)。sp和dp很類似但唯一的區(qū)別是,Android系統(tǒng)允許用戶自定義文字尺寸大?。ㄐ?、正常、大、超大等等),當(dāng)文字尺寸是“正常”時(shí)1sp=1dp=0.00625英寸,而當(dāng)文字尺寸是“大”或“超大”時(shí),1sp1dp=0.00625英寸。類似我們?cè)趙indows里調(diào)整字體尺寸以后的效果——窗口大小不變,只有文字大小改變。
還有一些詳細(xì)的情況需要了解,都在這個(gè)博客里: 點(diǎn)擊進(jìn)入