天天看點

螢幕适配基礎

之前有做過一些項目,用到的螢幕适配就是洪洋推薦的,根據分辨率,生成多套xml檔案,不同分辨率對應不同xml布局,這樣大概能覆寫80%的主流螢幕,一旦找不到對應的分辨率就GG。我也想過一個解決方法,對找不到對應分辨率的螢幕就加入預設一套xml。

雖然能解決問題,但是生成的多套檔案總歸占了不少apk空間,後面摒棄這個方法。改用dp的方式做适配,發現同一dp在不同分辨率的表現還是有所差異,特地花時間了解dp,dpi,px,ppi這些概念,寫個blog記憶。

概念

  • px

    像素值,美工給出的設計圖以此為機關

  • dp

    即dip,像素無關密度,1dp表示在螢幕像素點密度為160ppi時1px長度

  • dpi

    (dots per inch)螢幕密度,每英寸對應的像素點數 (ps:順便提到density,每平方英寸的像素點值

  • ppi

    (pixels per inch):也是螢幕密度,唯一不同的是每英寸對應的pixels,我粗略的認為和dpi等同(随時等大神指正,等到有人看再說:-D)

換算

如何用給的px畫圖并做适配才是最關鍵問題,那麼就涉及到機關的換算了。這裡我以nexus6為例。其參數可zol查:分辨率2560*1440,5.96英寸,493ppi。

  1. ppi的計算

    ppi=螢幕對角線上的像素點數/對角線長度 = √ (螢幕橫向像素點^2 + 螢幕縱向像素點^2)/對角線長度。

    用nexus6參數計算 即: √(2560^2+1440^2)/5.96約等于493ppi。證明zol基本無誤

  2. px和dp的換算

    螢幕像素密度在android使用中是固定的。目前android像素密度有以下幾種:

    密度 密度值(dpi) 分辨率 像素密度範圍(dpi)
    mdpi 160 320*480 120~160
    hdpi 240 480*800 160~240
    xhdpi 320 720*1080 240~320
    xxhdpi 480 1080*1920 320~480
    xxxhdpi 640 3840×2160 480~640

    (ps:目前ldpi的手機基本沒有了,忽略)

    前面談到ppi和dpi等同,nexus6是493ppi,但dpi是有固定的值和區間,按照表中對應,應該為xxxhdpi。

    1dp=640/160=4px

    引出一個公式

    1dp=(螢幕ppi/ 160)px

是以,我個人認為就根據ui給px換算dp填入适配即可。當然,多利用match_parent,wrap_content,weight這些機關才是王道