屏幕適配是 android?開(kāi)發(fā)/面試?繞不開(kāi)的一個(gè)問(wèn)題。本文 將屏幕適配的
知識(shí)要點(diǎn)
完整展現(xiàn)給各位讀者。站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到洛江網(wǎng)站設(shè)計(jì)與洛江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋洛江地區(qū)。
android需要做屏幕適配的原因
基礎(chǔ)知識(shí)點(diǎn)(很重要)
屏幕適配攻略
關(guān)鍵字:android碎片化
android面世以來(lái),google開(kāi)源了android系統(tǒng),各家廠(chǎng)商各自為政,導(dǎo)致屏幕尺寸沒(méi)有統(tǒng)一標(biāo)準(zhǔn),屏幕的寬高比各種各樣,屏幕密度也是各個(gè)廠(chǎng)家攀比的資本, 導(dǎo)致Android開(kāi)發(fā)者想要用一套代碼來(lái)適配所有的設(shè)備變得格外的困難,雖然 google出了 dp單位來(lái)替代px,但是 dp依然有它無(wú)法完全適配的地方。
這個(gè)也就是需要我們利用其他手段去 完成適配的地方。
Q: 關(guān)于屏幕適配,為什么 有了
dp
單位,依然要適配呢?
A:?dp
雖然能夠解決大部分情況下的適配問(wèn)題,但是針對(duì)少數(shù)機(jī)型,無(wú)法適配,
原因 是:?dp
單位,在現(xiàn)有的android
市場(chǎng)環(huán)境下,是不可靠
的,編碼時(shí)的?dp
,在運(yùn)行時(shí)會(huì)轉(zhuǎn)化成?px
,此時(shí)的px不能準(zhǔn)確對(duì)照UI的原本設(shè)計(jì)。
最直觀(guān)體現(xiàn)就是: 同樣300dp
,在A(yíng)手機(jī)上可以占滿(mǎn)全寬,但是在B手機(jī)上,占不滿(mǎn),或者會(huì)超出全寬。至于為什么dp不可靠?
?后面會(huì)解釋。
以下概念很基礎(chǔ),但是也很重要,基礎(chǔ)知識(shí)缺少一個(gè)環(huán)節(jié),后面復(fù)雜的攻略理解起來(lái)就有障礙。
像素點(diǎn)是物理概念,用術(shù)語(yǔ)來(lái)解釋?zhuān)褪侨缦逻@段話(huà):
通常所說(shuō)的像素,就是CCD/CMOS上光電感應(yīng)元件的數(shù)量,一個(gè)感光元件經(jīng)過(guò)感光,光電信號(hào)轉(zhuǎn)換,A/D轉(zhuǎn)換等步驟以后,在輸出的照片上就形成一個(gè)點(diǎn),我們?nèi)绻延跋穹糯髷?shù)倍,會(huì)發(fā)現(xiàn)這些連續(xù)色調(diào)其實(shí)是由許多色彩相近的小方點(diǎn)所組成,這些小方點(diǎn)就是構(gòu)成影像的最小單位“像素”(Pixel)。簡(jiǎn)而言之,像素就是手機(jī)屏幕的最小構(gòu)成單元。
簡(jiǎn)單來(lái)說(shuō),像素點(diǎn)就是屏幕上色彩區(qū)域的最小單位
。在所有的設(shè)備上,1px 都是等同的。UI姐姐作圖一般都會(huì)以px為單位。
比如:19201080 分辨率,表示當(dāng)前設(shè)備的屏幕是由 橫向1080?縱向1920 個(gè)像素點(diǎn) 組合而成。
屏幕對(duì)角線(xiàn)的長(zhǎng)度。 一般以英寸為單位,常見(jiàn)的屏幕尺寸有?
4.7
?,?5.5
?,6.0
?。
定義:?
一平方英寸
面積內(nèi),存在多少個(gè)
像素點(diǎn)。
同樣是?1920*1080
?的分辨率,存在兩款手機(jī),一個(gè)是4.7英寸,一個(gè)是6.0英寸,這兩者的?像素密度
是不一樣的。
屏幕密度的單位: dpi(dots per inch).
標(biāo)準(zhǔn)屏幕分辨率?:160dpi 。即:一平方英寸
面積,存在160
像素點(diǎn)。(mdpi).
像素密度
,可以由屏幕尺寸
和分辨率
計(jì)算得出。
計(jì)算公式為:比如下圖所示:
我這里有一塊1920*1080的5寸屏幕,通過(guò)上面的公式計(jì)算得出,它的像素密度為 440dpi .
可見(jiàn),px是和像素密度有直接關(guān)系的 像素單位。
全英文為:density-independent pixel.
(注意此處是dip
,上面的像素密度是?dpi
, 千萬(wàn)不要因?yàn)檫@個(gè),在面試的時(shí)候出丑 )
使用dp作為長(zhǎng)度單位,可以保證在不同的屏幕像素密度的手機(jī)上顯示 很相似的效果。
比如: 使用480x800
的手機(jī)上,要畫(huà)一條長(zhǎng)度為一半屏幕寬的線(xiàn)條,我們可以設(shè)置線(xiàn)條的長(zhǎng)度為?240px
,而在320x480
的屏幕上,我們只需要160px
,但是我們可以直接使用160dp
,來(lái)同時(shí)讓兩個(gè)屏幕上的這條線(xiàn)占全寬的一半。
px和dp的換算公式為:
px = dp * (dpi / 160)
公式解讀:
如果有一個(gè)屏幕密度為 160dpi的手機(jī),在它上面,1px=1dp;
而如果是 320dpi的手機(jī),則 1px = 0.5dp.
簡(jiǎn)而言之規(guī)律就是:?屏幕像素密度(dpi)越高的手機(jī),1dp所代表的px就越多.
下面解釋為什么dp有時(shí)候靠不住.
如果UI小姐姐以
320*480
?dpi160
的屏幕為標(biāo)準(zhǔn),畫(huà)了一條長(zhǎng)度為160px
的線(xiàn),長(zhǎng)度為屏幕寬度的一半
,這個(gè)時(shí)候,你直接用?160dp
,一般就能完成適配。但是如果這樣的布局 運(yùn)行在320x480
分辨率,但是屏幕密度為150dpi
?略小于?160dpi
,這個(gè)時(shí)候 你布局里面寫(xiě)的160dp
就會(huì)實(shí)際超過(guò)160px
?不再是占屏幕寬的一半,而是略微超過(guò)。
全英文為: scale-independent pixel (簡(jiǎn)稱(chēng)sp或者sip)
專(zhuān)門(mén)用于字體大小表示。
推薦使用12sp
以上的偶數(shù)作為 字體大小, 不要使用奇數(shù),或者浮點(diǎn)型小數(shù),因?yàn)槿菀自斐删葋G失。
面試點(diǎn)
Q: sp和dp有什么區(qū)別?
A: 通常情況下,dp和sp效果類(lèi)似,但是有一點(diǎn),如果用戶(hù) 調(diào)整了手機(jī)字體,比如 從標(biāo)準(zhǔn),變成了 超大,那么,1dp 原本等于1px依然不變,但是1sp就會(huì)從1px變成3px(只是舉個(gè)例子,數(shù)值不必認(rèn)真).
因此,在用戶(hù)調(diào)整字體的情況下,同樣的布局,可能出現(xiàn) 窗口大小不變,但是文字尺寸發(fā)生變化的情況。
使用多套布局適應(yīng)不同屏幕。此方法必須要了解?
布局限定符
的概念。
如圖:限定符: 在原本的
layout
后面加上橫杠,然后加上限定名。形成 layout-XXX的形式,具體規(guī)則請(qǐng)參考谷歌官網(wǎng):?https://developer.android.google.cn/training/multiscreen/screensizes, 重點(diǎn)摘錄如下:使用上面的限定符,幾乎可以解決所有的適配問(wèn)題,但是另外還有一個(gè)小技巧幫我們節(jié)省工作量 :布局別名.
適用情形為:當(dāng)多個(gè)加了限定符的 layout.xml中都引用了同一個(gè) 子布局,而子布局的內(nèi)容可能相同,也可能不同。
這個(gè)時(shí)候,使用布局別名,可以節(jié)省操作量。
方案評(píng)價(jià): 講道理,這個(gè)是
下下策
,因?yàn)樵谀阈枰薷牟季值臅r(shí)候,你可能需要修改多套布局,這個(gè)要多惡心就多惡心,懂的人都懂.
我們通過(guò)java代碼去獲取屏幕的寬高,動(dòng)態(tài)去指定控件的寬高 。
獲取屏幕寬高的方式我不想在這里占篇幅。
代碼適配,一般用于動(dòng)態(tài)創(chuàng)建 控件,或者自定義view自己繪制圖形的時(shí)候。
特別提一下接口適配:當(dāng)你去向后臺(tái)請(qǐng)求圖片的時(shí)候,我們可以在參數(shù)中帶入屏幕的寬高,或者是控件的寬高,來(lái)獲取我們想要的圖片,在圖片返回之后直接就能顯示得最優(yōu),而不需要我們app代碼中多動(dòng)手腳。
方案評(píng)價(jià):這個(gè)比下下策稍微好一點(diǎn),但是?
控件大小
直接進(jìn)入了代碼,還是讓代碼不夠雅觀(guān).
盡量直接通過(guò)一套布局解決所有的麻煩,這個(gè)就叫布局組件的適配。這個(gè)是上上策.
包含如下手段:
使用像素密度無(wú)關(guān)的單位?
dp sp
杜絕使用絕對(duì)布局,多使用相對(duì)和線(xiàn)性布局
多使用?wrap_content match_parent?以及線(xiàn)性布局的權(quán)重
多用?minWidth?minHeight,lines?等屬性
使用多套限定的?dimens中定義的尺寸
可能面試點(diǎn)
Q:同一個(gè)布局文件中,我使用線(xiàn)性布局和相對(duì)布局都可以達(dá)成目的,那么如何抉擇?
A: 使用相對(duì)布局,很有可能出現(xiàn) 第一次測(cè)量"不滿(mǎn)意"的情況,從而會(huì)測(cè)量第二次。如果兩者都可以達(dá)成目的,并且兩者的布局層級(jí)相同,并且線(xiàn)性布局中沒(méi)有使用到權(quán)重
(權(quán)重可能也會(huì)觸發(fā)第二次測(cè)量
),此時(shí),優(yōu)先使用線(xiàn)性布局。 除此之外,都選擇相對(duì)布局。
屏幕適配,工作中并不困難,但是面試多會(huì)問(wèn)到。
現(xiàn)今主流的兩種完美適配方案,有頭條方案(直接變更DisplayMetrics中的density),以及 多套dimens適配方案,兩者各有千秋。