天天看點

Android開發之螢幕适配

一、為什麼要适配

由于Android系統的開放性,任何使用者、開發者、硬體廠商、營運商都可以對Android系統和硬體進行定制,修改成他們想要的樣子。 

那麼這種“碎片化”到達什麼程度呢? 

以上每一個矩形都代表一種機型,且它們螢幕尺寸、螢幕分辨率大相徑庭。随着Android裝置的增多,裝置碎片化、系統碎片化、螢幕尺寸碎片化、螢幕碎片化的程度也在不斷加深。

備注: 

1. Android系統碎片化:基于Google原生系統,小米定制的MIUI、魅族定制的flyme、華為定制的EMUI等等; 

2. Android機型螢幕尺寸碎片化:5寸、5.5寸、6寸等等; 

3. Android螢幕分辨率碎片化:320x480、480x800、720x1280、1080x1920等;

當Android系統、螢幕尺寸、螢幕密度出現碎片化的時候,就很容易出現同一進制素在不同手機上顯示不同的問題。試想一下這麼一個場景: 

為4.3寸螢幕準備的UI設計圖,運作在5.0寸的螢幕上,很可能在右側和下側存在大量的空白;而5.0寸的UI設計圖運作到4.3寸的裝置上,很可能顯示不下。

為了保證使用者獲得一緻的使用者體驗效果,使得某一進制素在Android不同尺寸、不同分辨率的、不同系統的手機上具備相同的顯示效果,能夠保持界面上的效果一緻,我們需要對各種手機螢幕進行适配!

二、基本概念

1、像素(px):

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

機關:px(pixel),1px = 1像素點 

一般情況下UI設計師的設計圖會以px作為統一的計量機關。

2、分辨率:

含義:手機在橫向、縱向上的像素點數總和 

一般描述成 寬高 ,即橫向像素點個數 縱向像素點個數(如1080 x 1920)。

機關:px(pixel),1px = 1像素點

3、螢幕尺寸(in):

含義:手機對角線的實體尺寸

機關 英寸(inch),一英寸大約2.54cm 

常見的尺寸有4.7寸、5寸、5.5寸、6寸

4、螢幕像素密度(dpi):

含義:每英寸的像素點數。 

例如每英寸内有160個像素點,則其像素密度為160dpi。

機關:dpi(dots per inch)

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

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

Android螢幕尺寸

螢幕尺寸指的是螢幕的寬和高,Android中用一般用px為機關來指螢幕的寬高,比如說480*800的手機,指的就是width=480px,height=800px。

Android開發之螢幕适配

螢幕密度(Screen density)

螢幕密度指的是機關面積上的像素點的個數。像素點(pixel)螢幕上最小的顯示區域,不同分辨率的手機上像素點的大小不一樣,同樣尺寸的螢幕像素點越大螢幕上的像素點總數越少,分辨率越低,像素點越小,螢幕上像素點個數越多,分辨率越高。如下圖所示:

Android開發之螢幕适配

同樣大小的螢幕上同樣大小的a,左邊的像素點大,是以a所包含的像素點就少,分辨率就低,右邊像素點小,a包含的像素點數量多是以分辨率更高。下面的圖更加清晰的表現了像素點大小和分辨率的關系。

Android開發之螢幕适配

在面加1inch*1inch的螢幕上像素點越大像素點的總數越少,是以分辨率越低。

Android中尺寸機關以及關聯

Android開發中會遇到各種機關:

  1. px Pixels - 對應螢幕上的一個像素,像素的大小和手機有關一般不同分辨率的手機像素大小也不同。
  2. in Inches - 螢幕的實體尺寸. 1 Inch = 2.54 cm
  3. dp 或者dip

Density-independent Pixels,是和螢幕像素點密度相關的抽象機關,google官方規定在1 inch*1inch的面積上有160px的情況下1px=1dp,也就是說160dpi情況下1dp的大小和1px的大小相同。如果1 inch *1inch上像素點個數有240個也就是240dpi,此時1dp=1/160/(1/240px)=240/160px=1.5px. 是以dp與px的換算方法如下:

px = dp * (dpi / 160)
複制代碼
           

分辨率和螢幕密度以及像素大小之間的關系如下圖:

Android開發之螢幕适配

在Android中直接使用px作機關的問題

如果在布局中直接使用px來做機關會有什麼問題,如下圖,在圖中a的寬度為2px,高度為2px,在左圖中由于像素點比右圖像素點大,是以作圖中的a明顯比右圖中的a大。

Android開發之螢幕适配

要使在不同分辨率的螢幕上顯示圖檔的大小一樣,那麼肯定不能用px來做機關,如果使用dp來做機關呢,左右圖都是2dp*2dp,此時左右圖大小相等,因為1dp在不同的螢幕上大小相同,而1px在不同的螢幕上大小不同。

下面來看下在Android中為什麼要在不同的分辨率的目錄下放大小不同的圖:比如在drawable,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi,drawable-xxxhdpi目錄下圖檔大小不一樣:

Android開發之螢幕适配

為什麼在MDPI中圖像的大小是XXHDPI中圖像大小的1/4呢?原理是這樣的,在160dpi中1dp=1px1,而在640dpi中1dp=4px2,也就是說1px1=4px2,也就是說160dpi中一個像素大小是640dpi中一個像素大小的4倍,是以MDPI中的圖像看起來比XXXHDPI的圖像小4倍,但是由于MDPI中每個像素比XXXHDPI大4倍,是以顯示在螢幕上後大小是一樣的。

注意在Android中所有的尺寸機關最後都是轉化為px後再顯示的,因為螢幕顯示的基本機關就是px

源碼中dp轉換px的公式

private float dipToPx(float dip) {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip,
                getResources().getDisplayMetrics());
    }
           
public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }
           

最後

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

Android開發之螢幕适配

繼續閱讀