Android 屏幕完美適配方案

姓名 :唐來賓? ?學號:17101223417

轉(zhuǎn)載http://mp.weixin.qq.com/s/KZdgBglH5B013FA7d4u0MA

【嵌牛導(dǎo)讀】由于Android系統(tǒng)的開放性,任何用戶、開發(fā)者、硬件廠商、運營商都可以對Android系統(tǒng)和硬件進行定制,修改成他們想要的樣子。

【嵌牛鼻子】Android系統(tǒng),屏幕顯示

【嵌牛提問】開放性帶來的弊端

【嵌牛正文】

為什么要適配

由于Android系統(tǒng)的開放性,任何用戶、開發(fā)者、硬件廠商、運營商都可以對Android系統(tǒng)和硬件進行定制,修改成他們想要的樣子。

但是這種“碎片化”到達什么程度呢?

以上每一個矩形都代表一種機型,且它們屏幕尺寸、屏幕分辨率大相徑庭。隨著Android設(shè)備的增多,設(shè)備碎片化、品牌碎片化、系統(tǒng)碎片化、屏幕碎片化的程度也在不斷加深。

為了讓我們的Android應(yīng)用在各式各樣的手機上運行的時候,能夠保持界面效果一直,所以,我們需要對各種手機屏幕進行適配!

概念

1、像素(px)

通常所說的像素,就是CCD/CMOS上光電感應(yīng)元件的數(shù)量,一個感光元件經(jīng)過感光,光電信號轉(zhuǎn)換,A/D轉(zhuǎn)換等步驟以后,在輸出的照片上就形成一個點,我們?nèi)绻延跋穹糯髷?shù)倍,會發(fā)現(xiàn)這些連續(xù)色調(diào)其實是由許多色彩相近的小方點所組成,這些小方點就是構(gòu)成影像的最小單位“像素”(Pixel)。

簡而言之,像素就是手機屏幕的最小構(gòu)成單元。

2、分辨率

手機在橫向、縱向上的像素點數(shù)總和,一般描述成 寬*高 ,

橫向像素點個數(shù)*縱向像素點個數(shù)。

3、屏幕尺寸(in)

手機對角線的物理尺寸,單位 英寸(inch),一英寸大約2.54cm,常見的尺寸有4.7寸、5寸、5.5寸、6寸

4、屏幕像素密度(dpi)

每英寸長度上像素點個數(shù)。

例如每英寸內(nèi)有160個像素點,則其像素密度為160dpi。

公式:像素密度=像素/尺寸 (dpi=px/in)

5、標準屏幕像素密度(mdpi)

每英寸長度上還有160個像素點,即稱為標準屏幕像素密度(mdpi)。

6、像素密度等級

手機真實像素密度與標準屏幕像素密度(160dpi)的比值。官方給出的0.75、1、1.5、2、3、4,即對應(yīng)120dpi、160dpi、240dpi、320dpi、480dpi、640dpi。

7、密度無關(guān)像素(dp)

density-independent pixel,叫dp或dip,與終端上的實際物理像素點無關(guān)??梢员WC在不同屏幕像素密度的設(shè)備上顯示相同的效果,是安卓特有的長度單位。

8、獨立比例像素(sp)

scale-independent pixel,叫sp或sip,字體大小專用單位,可根據(jù)字體大小首選項進行縮放;

推薦使用12sp、14sp、18sp、22sp作為字體大小,不推薦使用奇數(shù)和小數(shù),容易造成精度丟失,12sp以下字體太小。

9、尺寸、像素、像素密度關(guān)系

10、px與dp關(guān)系

像素=dp*像素密度等級,即px=dp*(dpi/160)

對哪些設(shè)備適配

注意進行Android設(shè)備的屏幕適配操作,不是單單對屏幕尺寸多樣的各種設(shè)備進行的適配,在諸多的物理尺寸的背后是屏幕的分辨率,現(xiàn)在市面上占比最多的六種分辨率:480*800、320*480、480*854、540*960、720*1280、1080*1920。在日常適配中只要做好對這幾個設(shè)備的適配,就能很好的適配其他機型。但是在這幾種分辨率的背后存在的更為根本的數(shù)據(jù)是設(shè)備的屏幕像素密度。在Google文檔中對于屏幕的像素密度進行了幾種規(guī)定!

另外也需注意對安卓平板、安卓電視等大尺寸、超大尺寸設(shè)備的適配。

如何適配

1、適配誤區(qū)

在進行適配的時候,人們總是關(guān)注于:代碼、Layout、Dimens、圖片、權(quán)重,這幾種適配方式并不是屏幕適配的全部方案,除此之外還存在多種小細節(jié)來實現(xiàn)屏幕適配。

如何理解使用dp為單位進行適配?:

但是,使用密度無關(guān)像素(dp)也不能做到適配所有屏幕!

2、造成誤差原因

在長期的Android發(fā)展過程中,由于Android設(shè)備的增多,Google制定的屏幕密度標準(mdpi、hdpi、ldpi等),在眾多廠家的生產(chǎn)過程中,已經(jīng)被打破,人們沒有生產(chǎn)數(shù)完全符合屏幕密度標準的Android設(shè)備,對于真實手機的屏幕密度值,是在Google標準的周圍浮動變化的,但是不乏存在一些廠商生產(chǎn)的設(shè)備偏離Google的屏幕密度標準比較大,這個時候再使用dp作為單位就不能完完全全的完成適配操作!(dp只有在大家標準統(tǒng)一的情況下才有更好的發(fā)展)

在所有計算公式中存在誤差:在計算真實像素密度時運用了開方運算和除法運算,導(dǎo)致所得結(jié)果存在誤差。

理論計算造成的誤差:

在計算對角線上像素點個數(shù)時,我們使用勾股定理計算得出,但實則存在誤差:

若將像素長度當做1,分辨率指的是橫縱向上的1的個數(shù),計算記過表示的是對角線上有多少個1,但理論上對角線上 根號2 的個數(shù)才是像素點的個數(shù)!

屏幕對角線并不會和像素對角線重合,使計算結(jié)果存在誤差。

3、ldpi、mdpi、hdpi、xhdpi、xxhdpi的使用

官方截圖:

4、使用wrap_content、match_parent、權(quán)重

要確保布局的靈活性并適應(yīng)各種尺寸的屏幕,應(yīng)使用 “wrap_content” 、“match_parent”和權(quán)重控制某些視圖組件的寬度和高度。

使用 “wrap_content”,系統(tǒng)就會將視圖的寬度或高度設(shè)置成所需的最小尺寸以適應(yīng)視圖中的內(nèi)容,而 “match_parent”(在低于 API 級別 8 的級別中稱為 “fill_parent”)則會展開組件以匹配其父視圖的尺寸。

如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬編碼的尺寸,視圖就會相應(yīng)地僅使用自身所需的空間或展開以填滿可用空間。此方法可讓布局正確適應(yīng)各種屏幕尺寸和屏幕方向。

5、使用相對布局,不要使用絕對布局

我們大部分時候使用的都是線性布局、相對布局和幀布局,絕對布局由于適配性極差,所以極少使用。

關(guān)于布局的使用應(yīng)該具體情況具體分析,在進行電視機頂盒的開發(fā)中就是使用的是絕對布局。

6、使用限定符進行適配操作

使用尺寸限定符——large

使用最小寬度限定符——swdp

使用屏幕方向限定符

7、多套layout適配

res/values/layouts.xml:

res/values-sw600dp-land/layouts.xml:

res/values-sw600dp-port/layouts.xml:

res/values-large-land/layouts.xml:

res/values-large-port/layouts.xml:

8、使用自動拉伸位圖

支持各種屏幕尺寸通常意味著您的圖片資源還必須能適應(yīng)各種尺寸。例如,無論要應(yīng)用到什么形狀的按鈕上,按鈕背景都必須能適應(yīng)。

如果在可以更改尺寸的組件上使用了簡單的圖片,您很快就會發(fā)現(xiàn)顯示效果多少有些不太理想,因為系統(tǒng)會在運行時平均地拉伸或收縮您的圖片。解決方法為使用自動拉伸位圖,這是一種格式特殊的 PNG 文件,其中會指明可以拉伸以及不可以拉伸的區(qū)域。

.9的制作,實際上就是在原圖片上添加1px的邊界,然后按照我們的需求,把對應(yīng)的位置設(shè)置成黑色線,系統(tǒng)就會根據(jù)我們的實際需求進行拉伸。

9、普通圖片處理

稍后會詳細介紹。

10、dimens使用

如上圖,我將市面上各分辨率下的屏幕尺寸,取了平均數(shù),算出對應(yīng)的真實的屏幕像素密度,與理論要求的屏幕像素密度作了對比,比值在倒數(shù)第二列。發(fā)現(xiàn):(干貨要來了?。┱鎸嵪袼孛芏扰c理論像素密度的比值大致分為兩類,取其平均數(shù),一類在1.15左右,另一類則在0.89左右。巧了,它們兩類正好各自對應(yīng)w320dp和w360dp的寬度限定符!所以,dimens只需寫兩套即可(values-w320dp、values-w360dp),其name與真實數(shù)值的比值就是剛剛我們算出的兩個平均數(shù)! 以后我們就不需要對應(yīng)各種分辨率寫多套dimens了,兩套dimens即可。

圖片處理

1、logo

logo需要36*36、48*48、72*72、96*96、144*144、192*192px,圖片使用正方形形狀,在某些機型上面,會自動顯示為圓角正方形;

Android8.0以后,系統(tǒng)增加了logo點擊效果和動畫,可按以上尺寸制作圓形logo,但圖片必須為正方形,圓形以外區(qū)域透明。

2、普通圖片

UI切圖只需按照720*1280,4.7寸屏幕切圖即可;

應(yīng)為iphone6等分辨率、尺寸、像素密度都與要求接近,可使用IOS的2x圖代替。

3、純色圖、.9圖

純色按鈕或漸變按鈕可使用代碼設(shè)置顏色或.9圖實現(xiàn),不必用圖片作為背景。

4、動畫、自定義view、shape

可以使用代碼進行控制和展示多種視圖,如patch動畫替代幀動畫。

5、ImageView的ScaleType

關(guān)于ScaleType請參考這里:http://blog.csdn.net/jiashuai94/article/details/77673625

其他

1、代碼適配

在代碼中使用Google提供的API對設(shè)備的屏幕寬度進行測量,然后按照需求進行設(shè)置。

幾個主要使用的API:

對于當前控件的寬高設(shè)置,需要做的操作是首先要獲取到該控件的父控件,使用父控件對當前控件的寬高進行設(shè)置操作!

API

DisplayMetrics metrics = new DisplayMetrics ();

getWindowManager().getDefaultDisplay().getMetrics(metrics);

手機對應(yīng)的寬高:

Constants.screenHeight= metrics.heightDixels;

Constants.screenWidth= metrics.widthDixels;

RelativeLayout.LayoutParams=new RelativeLayout.LayoutParams();

(int)( Constants.screenHeight*0.5+0.5f);

(int)( Constants.screenWidth *0.5+0.5f);

在上面的兩個計算操作中最后加上0.5f的作用是:進行float強轉(zhuǎn)到int類型的時候會出現(xiàn)都是精度的問題。當使用Java代碼進行寬高設(shè)置的時候,假如出現(xiàn)320.2dp這樣的數(shù)據(jù)此時直接進行int得到的值是320;但是假如出現(xiàn)320.7這樣的數(shù)據(jù)的時候,由于int的計算規(guī)則,會直接強轉(zhuǎn)為320,但是從實際出發(fā),這個時候的值取321更為合適。

所以在計算的最后直接加0.5,這樣一來,320.2+0.5=320.7,進行數(shù)據(jù)的強轉(zhuǎn)操作得到的數(shù)據(jù)是320,320.7+0.5=321.2,進行數(shù)據(jù)強轉(zhuǎn)操作得到的數(shù)據(jù)是321,這樣一來得到的數(shù)據(jù)就和實際預(yù)想的更為接近!!

2、接口配合

本地加載圖片前判斷手機分辨率或像素密度,向服務(wù)器請求對應(yīng)級別圖片。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文參考自: Google的官方權(quán)威適配文檔 郭霖:Android官方提供的支持不同屏幕大小的全部方法 Storm...
    M悇芐冋憶閱讀 13,257評論 5 56
  • 一, 關(guān)于適配的一些概念性的知識 1.1. 重要的概念解釋 1.1.1. 屏幕尺寸: 屏幕尺寸指屏幕的對角線的長度...
    Simon_Zhang閱讀 1,740評論 1 3
  • 屏幕適配 屏幕適配的概念 碎片化既是 Android 的優(yōu)勢和弱點,也是開發(fā)者們頭疼的問題,同時也為 Androi...
    s酸菜閱讀 10,238評論 9 58
  • 我沒有三頭六臂是真, 常用番茄工作法是假, 我粗心大意是真, 工作有計劃是假, 我有小目標是真, 我有大夢想是假,...
    國民小扎西閱讀 475評論 5 3
  • 我的校園座落在繁茂的東山下,美麗的威海灣北,是一座美麗的現(xiàn)代化校園。 步入學校大門口,你會看見一棵...
    寫作天使閱讀 504評論 2 4

友情鏈接更多精彩內(nèi)容