天天看點

Android螢幕适配 重點盤點引子正文大綱正文結語

引子

螢幕适配是 android 開發/面試 繞不開的一個問題。本文 将螢幕适配的

知識要點

完整展現給各位讀者。

正文大綱

  • android需要做螢幕适配的原因
  • 基礎知識點(很重要)
  • 螢幕适配攻略

正文

android需要做螢幕适配的原因

關鍵字:

android碎片化

android面世以來,google開源了android系統,各家廠商各自為政,導緻螢幕尺寸沒有統一标準,螢幕的寬高比各種各樣,螢幕密度也是各個廠家攀比的資本, 導緻Android開發者想要用一套代碼來适配所有的裝置變得格外的困難,雖然 谷歌出了 dp機關來替代px,但是 dp依然有它無法完全适配的地方。

這個也就是需要我們利用其他手段去 完成适配的地方。

面試點

Q: 關于螢幕适配,為什麼 有了

dp

機關,依然要适配呢?

A: 

dp

雖然能夠解決大部分情況下的适配問題,但是針對少數機型,無法适配,

原因 是: 

google

提供的

dp

機關,在現有的

android

市場環境下,是

不可靠

的,編碼時的 

dp

,在運作時會轉化成 

px

,此時的px不能準确對照UI的原本設計。

最直覺展現就是: 同樣

300dp

,在A手機上可以占滿全寬,但是在B手機上,占不滿,或者會超出全寬。

至于為什麼dp不可靠?

 後面會解釋。

基礎知識點(很重要)

以下概念很基礎,但是也很重要,基礎知識缺少一個環節,後面複雜的攻略了解起來就有障礙。

1. 像素點

像素點是實體概念,用術語來解釋,就是如下這段話:

通常所說的像素,就是CCD/CMOS上光電感應元件的數量,一個感光元件經過感光,光電信号轉換,A/D轉換等步驟以後,在輸出的照片上就形成一個點,我們如果把影像放大數倍,會發現這些連續色調其實是由許多色彩相近的小方點所組成,這些小方點就是構成影像的最小機關“像素”(Pixel)。簡而言之,像素就是手機螢幕的最小構成單元。

簡單來說,像素點就是

螢幕上色彩區域的最小機關

。在所有的裝置上,1px 都是等同的。UI小姐姐作圖一般都會以px為機關。

2. 分辨率

比如:19201080 分辨率,表示目前裝置的螢幕是由 橫向1080 縱向1920 個像素點 組合而成。

3. 螢幕尺寸

螢幕對角線的長度。 一般以英寸為機關,常見的螢幕尺寸有 

4.7

 , 

5.5

 ,

6.0

 。

4. 螢幕像素密度

定義: 

一平方英寸

面積内,存在

多少個

像素點。

同樣是 

1920*1080

 的分辨率,存在兩款手機,一個是4.7英寸,一個是6.0英寸,這兩者的 

像素密度

是不一樣的。

螢幕密度的機關: dpi(dots per inch).

标準螢幕分辨率 :160dpi 。即:

一平方英寸

面積,存在

160

像素點。(mdpi).

5. 螢幕尺寸,分辨率,像素密度 三者之間的關系

像素密度

,可以由

螢幕尺寸

分辨率

計算得出。

計算公式為:

Android螢幕适配 重點盤點引子正文大綱正文結語
比如下圖所示:
Android螢幕适配 重點盤點引子正文大綱正文結語

我這裡有一塊1920*1080的5寸螢幕,通過上面的公式計算得出,它的像素密度為 440dpi .

可見,px是和像素密度有直接關系的 像素機關。

5. 密度無關的像素機關(dp,或者dip)

全英文為:density-independent pixel.

(注意此處是

dip

,上面的像素密度是 

dpi

, 千萬不要因為這個,在面試的時候出醜 )

使用dp作為長度機關,可以保證在不同的螢幕像素密度的手機上顯示 很相似的效果。

比如: 使用

480x800

的手機上,要畫一條長度為一半螢幕寬的線條,我們可以設定線條的長度為 

240px

,而在

320x480

的螢幕上,我們隻需要

160px

,但是我們可以直接使用

160dp

,來同時讓兩個螢幕上的這條線占全寬的一半。
px和dp的換算公式為:

px = dp * (dpi / 160)

公式解讀:

如果有一個螢幕密度為 160dpi的手機,在它上面,1px=1dp;

而如果是 320dpi的手機,則 1px = 0.5dp.

簡而言之規律就是: 螢幕像素密度(dpi)越高的手機,1dp所代表的px就越多.

下面解釋為什麼dp有時候靠不住.

如果UI小姐姐以

320*480

dpi160

的螢幕為标準,畫了一條長度為

160px

的線,長度為螢幕寬度的

一半

,這個時候,你直接用 

160dp

,一般就能完成适配。但是如果這樣的布局 運作在

320x480

分辨率,但是螢幕密度為

150dpi

 略小于 

160dpi

,這個時候 你布局裡面寫的

160dp

就會實際超過

160px

 不再是占螢幕寬的一半,而是略微超過。

6. 獨立比例像素 (sp)

全英文為: scale-independent pixel (簡稱sp或者sip)

專門用于字型大小表示。

推薦使用

12sp

以上的偶數作為 字型大小, 不要使用奇數,或者浮點型小數,因為容易造成精度丢失。

面試點

Q: sp和dp有什麼差別?

A: 通常情況下,dp和sp效果類似,但是有一點,如果使用者 調整了手機字型,比如 從标準,變成了 超大,那麼,1dp 原本等于1px依然不變,但是1sp就會從1px變成3px(隻是舉個例子,數值不必認真).

是以,在使用者調整字型的情況下,同樣的布局,可能出現 視窗大小不變,但是文字尺寸發生變化的情況。

螢幕适配攻略

1. 布局适配

使用多套布局适應不同螢幕。此方法必須要了解 

布局限定符

的概念。

如圖:

Android螢幕适配 重點盤點引子正文大綱正文結語
限定符: 在原本的

layout

後面加上橫杠,然後加上限定名。形成 layout-XXX的形式,具體規則請參考谷歌官網:  https://developer.android.google.cn/training/multiscreen/screensizes, 重點摘錄如下:
Android螢幕适配 重點盤點引子正文大綱正文結語
Android螢幕适配 重點盤點引子正文大綱正文結語

使用上面的限定符,幾乎可以解決所有的适配問題,但是另外還有一個小技巧幫我們節省工作量 : 布局别名.

适用情形為:當多個加了限定符的 layout.xml中都引用了同一個 子布局,而子布局的内容可能相同,也可能不同。

這個時候,使用布局别名,可以節省操作量。

Android螢幕适配 重點盤點引子正文大綱正文結語
Android螢幕适配 重點盤點引子正文大綱正文結語
方案評價: 講道理,這個是

下下策

,因為在你需要修改布局的時候,你可能需要修改多套布局,這個要多惡心就多惡心,懂的人都懂.

2 代碼适配

我們通過java代碼去擷取螢幕的寬高,動态去指定控件的寬高 。

代碼适配,一般用于動态建立 控件,或者自定義view自己繪制圖形的時候。

特别提一下接口适配:當你去向背景請求圖檔的時候,我們可以在參數中帶入螢幕的寬高,或者是控件的寬高,來擷取我們想要的圖檔,在圖檔傳回之後直接就能顯示得最優,而不需要我們app代碼中多動手腳。

方案評價:這個比下下策稍微好一點,但是 

控件大小

直接進入了代碼,還是讓代碼不夠雅觀.

3. 布局元件的适配

盡量直接通過一套布局解決所有的麻煩,這個就叫布局元件的适配。這個是上上策.

包含如下手段:

  • 使用像素密度無關的機關 

    dp sp

  • 杜絕使用絕對布局,多使用相對和線性布局
  • 多使用 wrap_content match_parent 以及線性布局的權重
  • 多用 minWidth minHeight,lines 等屬性
  • 使用多套限定的 dimens中定義的尺寸

可能面試點

Q:同一個布局檔案中,我使用線性布局和相對布局都可以達成目的,那麼如何抉擇?

A: 使用相對布局,很有可能出現 第一次測量"不滿意"的情況,進而會測量第二次。如果兩者都可以達成目的,并且兩者的布局層級相同,并且線性布局中沒有使用到

權重

(

權重可能也會觸發第二次測量

),此時,優先使用線性布局。 除此之外,都選擇相對布局。

結語

螢幕适配,工作中并不困難,但是面試多會問到。

現今主流的兩種完美适配方案,有頭條方案(直接變更DisplayMetrics中的density),以及 多套dimens适配方案,兩者各有千秋。

最後

如果你看到了這裡,覺得文章寫得不錯就給個贊呗!歡迎大家評論讨論!如果你覺得那裡值得改進的,請給我留言。一定會認真查詢,修正不足,定期免費分享技術幹貨。喜歡的小夥伴可以關注一下哦。謝謝!

Android螢幕适配 重點盤點引子正文大綱正文結語

繼續閱讀