Android適配全面總結(jié)(一)----屏幕適配

版權(quán)聲明:本文為博主原創(chuàng)文章(部分引用他人博文某抓,已加上引用說明)漱凝,未經(jīng)博主允許不得轉(zhuǎn)載疮蹦。http://www.reibang.com/p/7aa34434ad4d

轉(zhuǎn)載請標(biāo)明出處:
http://www.reibang.com/p/7aa34434ad4d
本文出自 AWeiLoveAndroid的博客


前言

Android適配是一個(gè)老生常談的問題,很多程序員覺得很惡心茸炒,不愿意做適配愕乎,但是又不得不做。然后老板說壁公,這位兄弟感论,做好了,今天晚飯給你加個(gè)雞腿紊册,然后程序員開始找各種資料比肄,忙活起來了,最終在苦逼的煎熬中做完了囊陡。

好了芳绩,言歸正傳,根據(jù)多年開發(fā)經(jīng)驗(yàn)撞反,總結(jié)一下Android適配主要表現(xiàn)在以下 3個(gè)方面:

1妥色、屏幕適配。(網(wǎng)上講的最多的就是這個(gè)痢畜。) 由于Android碎片化嚴(yán)重垛膝,導(dǎo)致開發(fā)中一套代碼在不同手機(jī)上運(yùn)行起來效果不是很好,兼容性不是很好丁稀,這就需要對不同分辨率吼拥,不同屏幕大小的手機(jī)做屏幕適配。

2线衫、版本適配凿可。 不同的系統(tǒng)版本api有所變更,既要適配高版本授账,也要做到兼容低版本枯跑。

具體講解請看鏈接: http://www.reibang.com/p/49fa8ebc0105

3、ROM適配白热。(這個(gè)是最難的敛助,工作量也是最大的,如果沒有不同版本手機(jī)適配的積累屋确,遇到問題都不知道怎么解決纳击。) 由于Android是開源的续扔,不同的手機(jī)廠商有自己定制的ROM,對系統(tǒng)的api可能有變更焕数,也有可能新增一些api纱昧,所以在開發(fā)中,要針對不同廠商的手機(jī)做一些特殊適配堡赔。

具體講解請看鏈接: http://www.reibang.com/p/f9c67a4b908e

廢話少說识脆,開始進(jìn)入正題。這篇文章我們先講解第一個(gè)問題 ---- 屏幕適配善已。

一灼捂、屏幕適配是啥(可能有人不懂,我在此簡單解釋一下)雕拼?

程序猿把設(shè)計(jì)獅制作的效果圖應(yīng)用到不同的手機(jī)纵东,對不同的屏幕進(jìn)行界面調(diào)整的過程,確保界面不變形啥寇,呈現(xiàn)效果圖的位置偎球、尺寸、比例辑甜。

二衰絮、需要掌握的幾個(gè)知識點(diǎn)。

(1)屏幕物理尺寸

屏幕對角線的尺寸磷醋。單位是英寸猫牡,1英寸 ≈ 2.54厘米

比如常見的屏幕尺寸有5.0、5.1邓线、5.2淌友、5.5、5.7骇陈、5.9震庭、6.0等

(2)屏幕分辨率

  • 定義:

    確定計(jì)算機(jī)屏幕上顯示多少信息的設(shè)置,以水平和垂直像素來衡量你雌。

  • 計(jì)算公式:

    屏幕分辨率 = 橫向像素*縱向像素(或者 寬x高)器联,如 1080*1920
  • 單位:

    單位是px,1px=1個(gè)像素點(diǎn)婿崭。

  • 常見分辨率:

720x1280拨拓、1080x1920(當(dāng)然還有480x800,這個(gè)很少見了)

(3)屏幕像素密度(dots per inch氓栈,簡稱dpi)

  • 含義:每英寸上的像素點(diǎn)數(shù)渣磷。

    屏幕像素密度與屏幕尺寸和屏幕分辨率有關(guān),在單一變化條件下授瘦,屏幕尺寸越小醋界、分辨率越高祟身,像素密度越大,反之越小物独。

  • dpi和ppi:

dpi最初用于衡量打印物上每英寸的點(diǎn)數(shù)密度。DPI值越小圖片越不精細(xì)氯葬。當(dāng)DPI的概念用在計(jì)算機(jī)屏幕上時(shí)挡篓,就應(yīng)稱之為ppi。同理: PPI就是計(jì)算機(jī)屏幕上每英寸可以顯示的像素點(diǎn)的數(shù)量帚称。因此官研,在電子屏幕顯示中提到的ppi和dpi是一樣的,可認(rèn)為dpi=ppi

  • 單位:dpi(dots per inch)

    假設(shè)設(shè)備內(nèi)每英寸有240個(gè)像素闯睹,那么該設(shè)備的屏幕像素密度=240dpi

  • 不同手機(jī)屏幕大小對應(yīng)的屏幕像素密度關(guān)系表:

密度類型 代表的分辨率(px) 屏幕像素密度(dpi)
低密度(ldpi) 240x320 120
中密度(mdpi) 320x480 160
高密度(hdpi) 480x800 240
超高密度(xhdpi) 720x1280 320
超超高密度(xxhdpi) 1080x1920 480
  • 當(dāng)然與像素有關(guān)的還有一個(gè)單位ppi戏羽,這個(gè)我們安卓中用不到,有興趣的可以百度一下楼吃。

(4)以上三者(屏幕尺寸始花、分辨率、像素密度)之間的關(guān)系

屏幕尺寸孩锡、分辨率酷宵、像素密度之間的換算圖

(5)密度無關(guān)像素(dp 或 dip)

  • 單位:dp,可以保證在不同屏幕像素密度的設(shè)備上顯示相同的效果

  • Android開發(fā)設(shè)置布局和控件寬高躬窜,用dp而不是px浇垦,dp是Android特有的單位

  • dp與px的轉(zhuǎn)換

    因?yàn)閡i給的圖是以 px 為單位的,Android開發(fā)則是使用 dp 作為單位的荣挨,那么我們需要進(jìn)行轉(zhuǎn)換:

    在Android中男韧,規(guī)定以160dpi(即屏幕分辨率為320x480)為基準(zhǔn):1dp=1px

【特大誤區(qū)】:網(wǎng)上關(guān)于px和sp的換算公式全部都寫反了,我在這里糾正一下默垄。如下圖所示:

我創(chuàng)建了一個(gè)模擬器此虑。

轉(zhuǎn)換過程 轉(zhuǎn)換公式 示例
dp單位轉(zhuǎn)換成px單位 px = dp* (devicePixelRatio)= dp*(density/160) 假如density(像素密度)為320,把360dp轉(zhuǎn)換成px厕倍,那么最終像素=360dp*(320/160)=720px
px單位轉(zhuǎn)換成dp單位 dp = px * (devicePixelRatio)=px * (density/160) 假如density(像素密度)為320寡壮,把640dp轉(zhuǎn)換成px,那么最終像素=640dp*(320/160)=1280px

我們通過換算公式可以得知:假如devicePixelRatio為2讹弯,那么1px=2dp况既,網(wǎng)上那些1dp=2px的都是扯淡,都是沒有做過實(shí)踐的组民,亂寫的棒仍。

(6)獨(dú)立比例像素(sp)

  • 單位:sp
  • Android開發(fā)時(shí)用sp設(shè)置文字大小,使用它可以根據(jù)文字大小首選項(xiàng)進(jìn)行放縮。
  • 不推薦使用奇數(shù)和小數(shù)臭胜,容易造成精度的丟失問題莫其;小于12sp的字體會太小導(dǎo)致用戶看不清癞尚。

下面給一個(gè)實(shí)例說明,讓你更能明白這幾個(gè)單位:

看下圖你可以知道:為什么使用了dp作為單位乱陡,兩個(gè)手機(jī)分辨率也是一樣的浇揩,可是按鈕顯示的寬度還是不一樣?


三憨颠、屏幕適配的本質(zhì)

總結(jié)一下胳徽,主要有以下兩點(diǎn):

  • (1)使得“布局”、“布局組件”爽彤、“圖片資源”养盗、“用戶界面流程”匹配不同的屏幕尺寸

  • (2)使得“圖片資源”匹配不同的屏幕密度

四、屏幕適配具體的解決方案

首先看一張圖:


屏幕適配 具體實(shí)現(xiàn)方式
4.1 屏幕尺寸適配

4.1.1.布局適配

  • 4.1.1.1. 使得布局元素自適應(yīng)屏幕尺寸

??解決方案:使用相對布局(RelativeLayout)适篙,禁用絕對布局(AbsoluteLayout)往核。這個(gè)很基礎(chǔ),就不多說了嚷节。

  • 4.1.1.2. 根據(jù)屏幕的配置來加載相應(yīng)的UI布局聂儒。為不同屏幕尺寸的設(shè)備設(shè)計(jì)不同的布局。

??解決方案:使用限定符丹喻。通過配置限定符使得程序在運(yùn)行時(shí)根據(jù)當(dāng)前設(shè)備的配置(屏幕尺寸)自動加載合適的布局資源薄货。

限定符分類:
(1)尺寸(size)限定符(這種方式只適合Android 3.2版本之前
??res目錄新建一個(gè)layout-large文件夾,布局名字和res/layout里面的同名碍论。在平板電腦和電視的屏幕(>7英寸)上:實(shí)施 雙面板 模式以同時(shí)顯示更多內(nèi)容谅猾,它會加載res/layout-large里面的布局,在手機(jī)較小的屏幕上:使用 單面板 分別顯示內(nèi)容鳍悠,加載的是res/layout里面的同名布局税娜。

尺寸(size)限定符

(2)最小寬度(Smallest-width)限定符。
??通過指定某個(gè)最小寬度(以 dp 為單位)來精確定位屏幕從而加載不同的UI資源藏研。(適用于Android 3.2及之后版本
??最小寬度限定符可讓您通過指定某個(gè)最小寬度(以 dp 為單位)來定位屏幕敬矩。例如,標(biāo)準(zhǔn) 7 英寸平板電腦的最小寬度為 600 dp蠢挡,因此如果您要在此類屏幕上的用戶界面中使用雙面板(但在較小的屏幕上只顯示列表)弧岳,您可以使用上文中所述的單面板和雙面板這兩種布局,但您應(yīng)使用 sw600dp 指明雙面板布局僅適用于最小寬度為 600 dp 的屏幕业踏,而不是使用 large 尺寸限定符禽炬。
最小寬度(Smallest-width)限定符

(3)布局別名
??為了解決文件名的重復(fù)從而帶來一些列后期維護(hù)的問題晓猛,我們使用 布局別名 方案锅棕。
通過以上兩點(diǎn)杭措,大家也會發(fā)現(xiàn)一個(gè)問題:
??適配手機(jī)沒問題搂鲫。但是適配平板發(fā)現(xiàn)Android3.2前后的這兩個(gè)文件內(nèi)容是一樣的,只是文件名不同而已同窘。

適配手機(jī)的單面板(默認(rèn))布局:res/layout/main.xml
適配尺寸>7寸平板的雙面板布局(Android 3.2前):res/layout-large/main.xml
適配尺寸>7寸平板的雙面板布局(Android 3.2后)res/layout-sw600dp/main.xml

解救方案:取一個(gè)別名就好了殖氏,示例如下:


布局別名

這樣兩個(gè)layout.xml都只是引用了@layout/main_twopanes众雷,就避免了重復(fù)定義布局文件的情況

(4)屏幕方向(Orientation)限定符。
??根據(jù)屏幕方向進(jìn)行布局的調(diào)整绎巨。
??某些布局會同時(shí)支持橫向模式和縱向模式近尚,但我們可以通過調(diào)整優(yōu)化其中大部分布局的效果。每種屏幕尺寸和屏幕方向下的布局行為方式如下所示:

  • 小屏幕场勤,縱向:單面板肿男,帶徽標(biāo)
  • 小屏幕,橫向:單面板却嗡,帶徽標(biāo)
  • 7 英寸平板電腦,縱向:單面板嘹承,帶操作欄
  • 7 英寸平板電腦窗价,橫向:雙面板,寬叹卷,帶操作欄
  • 10 英寸平板電腦撼港,縱向:雙面板,窄骤竹,帶操作欄
  • 10 英寸平板電腦帝牡,橫向:雙面板,寬蒙揣,帶操作欄
  • 電視靶溜,橫向:雙面板,寬懒震,帶操作欄

解決方案:
第一步:先定義類別:單/雙面板罩息、是否帶操作欄、寬/窄

定義在 res/layout/ 目錄下的某個(gè) XML 文件中

第二步:再進(jìn)行相應(yīng)的匹配:屏幕尺寸(小屏个扰、7寸瓷炮、10寸)、方向(橫递宅、縱)

使用布局別名進(jìn)行匹配

示例代碼如下圖所示:

屏幕方向(Orientation)限定符

這里沒有完全把全部尺寸匹配類型的代碼貼出來娘香,大家可以自己去嘗試把其補(bǔ)充完整。


4.1.2. 布局組件適配
使得布局組件自適應(yīng)屏幕尺寸办龄。

  • 解決方案:使用"wrap_content"烘绽、"match_parent"和"weight“來控制視圖組件的寬度和高度土榴。這個(gè)很基礎(chǔ)呀打,這幾個(gè)的用法大家應(yīng)該都經(jīng)常用的,就不多說了豺憔。

4.1.3. 圖片資源適配
使得圖片資源在不同屏幕密度上顯示相同的像素效果恭应。

??在實(shí)際開發(fā)中一個(gè)按鈕的背景圖片必須能夠隨著按鈕大小的改變而改變。使用普通的圖片將無法實(shí)現(xiàn)這個(gè)效果,因?yàn)檫\(yùn)行時(shí)會對圖片均勻地拉伸或壓縮。

  • 解決方案:使用自動拉伸位圖(nine-patch圖片)纯趋,后綴名是.9.png,它是一種被特殊處理過的PNG圖片唇兑,設(shè)計(jì)時(shí)可以指定圖片的拉伸區(qū)域和非拉伸區(qū)域图甜;使用時(shí),系統(tǒng)就會根據(jù)控件的大小自動地拉伸你想要拉伸的部分潮秘。

  • 注意事項(xiàng):

    • 1.必須使用UI給的圖片格式(.9.png后綴)柜候,隨意更改后綴使用在項(xiàng)目中會報(bào)錯(cuò)高诺,因?yàn)橄到y(tǒng)就是根據(jù)這個(gè)來區(qū)別nine-patch圖片和普通的PNG圖片的。
    • 2.部分nine-patch圖片在Android Studio項(xiàng)目中不能識別穆律,會報(bào)錯(cuò)惠呼,需要謹(jǐn)慎使用。
  • 下面一張圖看看使用nine-patch圖片的效果:

使用 nine-patch 圖片的效果

nine-patch圖片制作請參考我的博客:
nine-patch圖片的制作


4.1.4. 用戶界面流程適配
根據(jù)屏幕的配置來加載相應(yīng)的用戶界面流程峦耘。

  • 使用場景:我們會根據(jù)設(shè)備特點(diǎn)顯示恰當(dāng)?shù)牟季痔尢#沁@樣做,會使得用戶界面流程可能會有所不同辅髓。
    ??例如:如果應(yīng)用處于雙面板模式下泣崩,點(diǎn)擊左側(cè)面板上的項(xiàng)即可直接在右側(cè)面板上顯示相關(guān)內(nèi)容;而如果該應(yīng)用處于單面板模式下洛口,點(diǎn)擊相關(guān)的內(nèi)容應(yīng)該跳轉(zhuǎn)到另外一個(gè)Activity進(jìn)行后續(xù)的處理矫付。

  • 解決方案(最終目的是進(jìn)行用戶界面流程的自適應(yīng)配置,其實(shí)就是用java代碼動態(tài)加載):

① 確定當(dāng)前布局第焰。示例如下:

由于每種布局的實(shí)施都會稍有不同买优,因此我們需要先確定當(dāng)前向用戶顯示的布局。
例如,我們可以先了解用戶所處的是“單面板”模式還是“雙面板”模式杀赢。

確定當(dāng)前布局

② 根據(jù)當(dāng)前布局做出響應(yīng)烘跺。示例如下:

有些操作可能會因當(dāng)前的具體布局而產(chǎn)生不同的結(jié)果。
例如葵陵,在新聞閱讀器示例中液荸,如果用戶界面處于雙面板模式下,那么點(diǎn)擊標(biāo)題列表中的標(biāo)題就會在右側(cè)面板中切換到相應(yīng)報(bào)道(Fragment)脱篙;但如果用戶界面處于單面板模式下娇钱,那么上述操作就會啟動一個(gè)獨(dú)立Activity:

根據(jù)當(dāng)前布局做出響應(yīng)

③ 重復(fù)使用其他 Activity 中的 Fragment。示例如下:

例如绊困,在新聞閱讀器示例中文搂,對于較大的屏幕,新聞報(bào)道文本會顯示在右側(cè) Fragment 面板中秤朗;但對于較小的屏幕煤蹭,這些文本就會以獨(dú)立 Activity 的形式存在。

重復(fù)使用其他 Activity 中的 Fragment

④ 處理屏幕配置變化取视。示例如下:

如果我們使用獨(dú)立Activity實(shí)施界面的獨(dú)立部分硝皂,那么請注意,我們可能需要對特定配置變化(例如屏幕方向的變化)做出響應(yīng)作谭,以便保持界面的一致性稽物。

例如,在運(yùn)行 Android 3.0 或更高版本的標(biāo)準(zhǔn) 7 英寸平板電腦上折欠,如果新聞閱讀器示例應(yīng)用運(yùn)行在縱向模式下贝或,就會在使用獨(dú)立Activity 顯示新聞報(bào)道;但如果該應(yīng)用運(yùn)行在橫向模式下锐秦,就會使用雙面板布局咪奖。


處理屏幕配置變化
4.2 屏幕密度適配

4.2.1.布局控件適配
使得布局組件在不同屏幕密度上顯示相同的像素效果。

解決方案有以下兩種:

  • (1)使用 密度無關(guān)像素 ( dp ) 或 獨(dú)立比例像素( sp ) 作為計(jì)量單位酱床。
    • 使用場景:假如同樣都是畫一條長度是屏幕一半的線羊赵,如果使用px作為計(jì)量單位,那么在480x800分辨率手機(jī)上設(shè)置應(yīng)為240px扇谣;在320x480的手機(jī)上應(yīng)設(shè)置為160px慷垮,二者設(shè)置就不同了;如果使用dp為單位揍堕,在這兩種分辨率下料身,160dp都顯示為屏幕一半的長度。
    • dppx 的轉(zhuǎn)換在前面有介紹衩茸,這里就不說了芹血。
    • 為了能夠進(jìn)行不同屏幕像素密度的匹配,應(yīng)該這樣做:
    1. 使用dp來代替px作為控件寬高的統(tǒng)一度量單位。
    2. 使用sp作為文字的統(tǒng)一度量單位幔烛。
    

有下面一種場景:
RelativeLayout布局里面啃擦,水平方向上放置兩個(gè)按鈕,一個(gè)是150dp左對齊饿悬,另外一個(gè)是200dp右對齊令蛉。在屏幕總寬度為360dp的Nexus5上中間有10dp的間隙。但同樣地設(shè)置在Nexus S(屏幕寬度是320dp)狡恬,會發(fā)現(xiàn)珠叔,兩個(gè)按鈕會重疊,因?yàn)?20dp<200+150dp弟劲。
如圖:


Nexus5 效果
Nexus S 效果

從上面可以看出祷安,由于Android屏幕設(shè)備的多樣性,如果使用dp來作為度量單位兔乞,并不是所有的屏幕的寬度都具備相同的dp長度汇鞭。
dp解決了同一數(shù)值在 不同分辨率 中展示 相同尺寸大小 的問題(即屏幕像素密度匹配問題),但卻沒有解決設(shè)備 尺寸大小匹配 的問題庸追。(即屏幕尺寸匹配問題)霍骄。

注意:屏幕寬度和像素密度沒有任何關(guān)聯(lián)關(guān)系。
  • (2)使用像素作為計(jì)量單位淡溯,采用百分比布局读整。

    • 從上面案例看出,因?yàn)槠聊幻芏龋ǚ直媛剩┎灰粯友圆荒苡霉潭ǖ膒x;因?yàn)槠聊粚挾炔灰粯蛹彘梗砸⌒牡挠胐p豺总。

    • 因?yàn)楸举|(zhì)上是希望使得布局組件在不同屏幕密度上顯示相同的像素效果,那么择懂,之前是繞了個(gè)彎使用dp解決這個(gè)問題喻喳,那么到底能不能直接用px解決呢?當(dāng)然是可以的困曙。根據(jù)不同屏幕密度表伦,控件選擇對應(yīng)的像素值大小。解決方法是: 百分比適配慷丽。

    • 先說一下缺點(diǎn)
      使用像素作為計(jì)量單位的適配方式蹦哼,應(yīng)該能進(jìn)行90%的適配了,但其 缺點(diǎn) 還是很明顯:

    1.由于實(shí)際上還是使用px作為長度的度量單位要糊,所以和google的要求使用dp作為度量單位會有所背離
    2.必須盡可能多的包含所有分辨率纲熏,因?yàn)檫@個(gè)是使用這個(gè)方案的基礎(chǔ),如果有某個(gè)分辨率缺少,將無法完成該屏幕的適配
    3.過多的分辨率像素描述xml文件會增加軟件包的大小和維護(hù)的難度

★ 1.以某一分辨率為基準(zhǔn)局劲,生成所有分辨率對應(yīng)像素?cái)?shù)列表

現(xiàn)在我們以320x480的分辨率為基準(zhǔn):

將屏幕的寬度分為320份勺拣,取值為x1x320,將屏幕的高度分為480份鱼填,取值為y1y480
然后生成該分辨率對應(yīng)像素?cái)?shù)的列表药有,如下圖:

基準(zhǔn)分辨率像素列表

找到基準(zhǔn)后,是時(shí)候把其他分辨率補(bǔ)全了苹丸,以下是以1080x1920的分辨率為例:


關(guān)于自動生成values文件夾愤惰,這里推薦兩個(gè)工具:
AndroidPixelDimenGenerator ,使用方式可以百度一下谈跛,這不是本文的重點(diǎn)羊苟。
② 張鴻洋大神寫的autolayout.jar這個(gè)工具,下載地址請點(diǎn)此 感憾,使用方法如下圖所示:

自動生成values文件夾以及對應(yīng)的dimens.xml文件.gif

★ 2.將生成像素?cái)?shù)列表存放在res目錄下對應(yīng)的values文件下蜡励,這個(gè)步驟上面的動態(tài)圖已經(jīng)做了。

注意事項(xiàng):

  • (1)對應(yīng)分辨率的資源文件應(yīng)放在res/values對應(yīng)的文件夾中阻桅。比如分辨率為1920x1080的資源文件應(yīng)放在res/values-1920x1080文件夾中凉倚。
  • (2)必須在默認(rèn)values里面也創(chuàng)建對應(yīng)默認(rèn)lay_x.xml和lay_y.xml文件,只是單位是dp嫂沉。如果默認(rèn)values文件夾沒有(即沒有對應(yīng)的分辨率稽寒、沒有對應(yīng)dimen)就會報(bào)錯(cuò),從而無法進(jìn)行屏幕適配趟章。

★ 3.根據(jù)UI設(shè)計(jì)師給出設(shè)計(jì)圖上的尺寸杏糙,找到對應(yīng)像素?cái)?shù)的單位,然后設(shè)置給控件即可蚓土。如下圖:

<FrameLayout >
    <Button
        android:layout_gravity="center"
        android:gravity="center"
        android:text="@string/hello_world"
        android:layout_width="@dimen/x160"
        android:layout_height="@dimen/y160"/>
</FrameLayout>

4.2.2.圖片資源適配
使得圖片資源在不同屏幕密度上顯示相同的像素效果宏侍。

  • 解決方案:提供備用位圖(符合屏幕尺寸的圖片資源)

  • 常見做法步驟如下:

    ★ 1.根據(jù)以下尺寸范圍針對各密度生成相應(yīng)的圖片:(一套分辨率設(shè)計(jì)一套位圖資源

    谷歌官方給出的屏幕密度對應(yīng)的圖標(biāo)尺寸對照表

比如說,如果我們?yōu)?xxhdpi 設(shè)備生成了144144 px尺寸的圖片蜀漆,就應(yīng)該按照相應(yīng)比例地為 hdpi谅河、xhdpi 和 xxhdpi 設(shè)備分別生成 7272 px 、9696 px 和 192192 px 尺寸的圖片确丢。

★ 2.將生成的圖片文件放在 res/ 下的相應(yīng)子目錄中(mdpi绷耍、hdpi、xhdpi鲜侥、xxhdpi)褂始,系統(tǒng)就會根據(jù)運(yùn)行您應(yīng)用的設(shè)備的屏幕密度自動選擇合適的圖片。

★ 3.通過引用 @drawable/id描函,系統(tǒng)都能根據(jù)相應(yīng)屏幕的 屏幕密度(dpi)自動選取合適的位圖病袄。

  • 注意事項(xiàng):
    1.如果是.9圖或者是不需要多個(gè)分辨率的圖片搂赋,放在drawable文件夾即可。
    2.對應(yīng)分辨率的圖片要正確的放在合適的文件夾益缠,否則會造成圖片拉伸等問題脑奠。
  • 圖片資源適配的 缺點(diǎn):
1. 每套分辨率出一套圖,為美工或者設(shè)計(jì)增加了許多工作量

2. 對Android工程文件的apk包變的很大
  • 稍微優(yōu)化一下:有沒有一種方法幅慌,保證屏幕密度適配宋欺,可以最小占用設(shè)計(jì)資源,使得apk包不變大(只使用一套分辨率的圖片資源)胰伍?下面我們就來介紹這個(gè)方法:
    只需選擇唯一一套分辨率規(guī)格的圖片資源齿诞。
    xhdpi 應(yīng)該是首選。目前市面上最普遍的高端機(jī)的分辨率還多集中在720X1080范圍內(nèi)(xhdpi)骂租,所以目前來看xhpdi規(guī)格的圖片資源成為了首選祷杈。

  • 動態(tài)設(shè)置屬性,做到完美適配:

    ① 給ImageView設(shè)置不同的ScaleType屬性會得到不同的顯示效果渗饮,一般情況下但汞,設(shè)置為centerCrop能獲得較好的適配效果。
    ② 有些情況下互站,我們需要動態(tài)的設(shè)置控件大小或者是位置私蕾,比如說popwindow的顯示位置和偏移量等。這時(shí)我們可以動態(tài)獲取當(dāng)前的屏幕屬性胡桃,然后設(shè)置合適的數(shù)值踩叭。

public class ScreenSizeUtil { 
    public static int getScreenWidth(Activity activity) { 
        return activity.getWindowManager().getDefaultDisplay().getWidth(); 
    } 
    public static int getScreenHeight(Activity activity) { 
        return activity.getWindowManager().getDefaultDisplay().getHeight(); 
    }
}

③.使用第三方的屏幕適配框架。
`


本文參考文章:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翠胰,一起剝皮案震驚了整個(gè)濱河市容贝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌之景,老刑警劉巖斤富,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闺兢,居然都是意外死亡茂缚,警方通過查閱死者的電腦和手機(jī)戏罢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門屋谭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人龟糕,你說我怎么就攤上這事桐磁。” “怎么了讲岁?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵我擂,是天一觀的道長衬以。 經(jīng)常有香客問我,道長校摩,這世上最難降的妖魔是什么看峻? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衙吩,結(jié)果婚禮上互妓,老公的妹妹穿的比我還像新娘。我一直安慰自己坤塞,他們只是感情好冯勉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摹芙,像睡著了一般灼狰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浮禾,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天交胚,我揣著相機(jī)與錄音,去河邊找鬼伐厌。 笑死承绸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挣轨。 我是一名探鬼主播军熏,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卷扮!你這毒婦竟也來了荡澎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤晤锹,失蹤者是張志新(化名)和其女友劉穎摩幔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞭铆,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡或衡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了车遂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片封断。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舶担,靈堂內(nèi)的尸體忽然破棺而出坡疼,到底是詐尸還是另有隱情,我是刑警寧澤衣陶,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布柄瑰,位于F島的核電站闸氮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏教沾。R本人自食惡果不足惜蒲跨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望授翻。 院中可真熱鬧财骨,春花似錦、人聲如沸藏姐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羔杨。三九已至捌臊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兜材,已是汗流浹背理澎。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曙寡,地道東北人糠爬。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像举庶,于是被迫代替她去往敵國和親执隧。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容