天天看點

Android中你可能忽略的知識點(1)-分辨率那些事

版權聲明:本文為部落客原創文章,轉載請标明出處。 https://blog.csdn.net/lyhhj/article/details/80265069

一、dp/dip、px、sp、dpi基本概念

  • dp/dip(device independent pixels) 裝置獨立像素 與裝置有關系 對角線每英寸的像素點的個數
  • px 像素,pixel的縮寫。這個應該不需要過多解釋,平常我們所說的手機的分辨率為1920x1080,這裡的機關用的就是px,也就是說高為1920個像素,寬為1080個像素
  • sp 在Android中用來表示字型大小,“Android sp機關除了受螢幕密度影響外,還受到使用者的字型大小影響,通常情況下,建議使用sp來跟随使用者字型大小設定。除非一些特殊的情況,不想跟随系統字型變化的,可以使用dp
  • dpi 是dot per inch,每英寸多少點,ppi是 Pixel per inch,每英寸像素數,針對顯示器的設計時,dpi=ppi

二、ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi

在Android開發中我們經常看到資源檔案下面有這樣六個檔案夾,很多人其實并不是真正的了解它們的意思,為什麼會有這6個檔案夾?相信大部分人也就知道是為了螢幕适配,大一點分辨率的圖檔放到大的檔案夾裡,具體的說一下,首先看一下:

當然還有xxxhdpi 它的分辨率為2160x3840,也就是常說的4K屏,目前市場上好像隻有一款索尼Xperia Z5 Premium。

其實這六個密度的圖檔檔案夾與之對應的是Android**DisplayMetrics**類中的6個常量

/**
     * Standard quantized DPI for low-density screens.
     */
    public static final int DENSITY_LOW = 120;

    /**
     * Standard quantized DPI for medium-density screens.
     */
    public static final int DENSITY_MEDIUM = 160;

    /**
     * Standard quantized DPI for high-density screens.
     */
    public static final int DENSITY_HIGH = 240;

    /**
     * Standard quantized DPI for extra-high-density screens.
     */
    public static final int DENSITY_XHIGH = 320;

    /**
     * Standard quantized DPI for extra-extra-high-density screens.
     */
    public static final int DENSITY_XXHIGH = 480;

     /**
     * Standard quantized DPI for extra-extra-extra-high-density screens.  Applications
     * should not generally worry about this density; relying on XHIGH graphics
     * being scaled up to it should be sufficient for almost all cases.  A typical
     * use of this density would be 4K television screens -- 3840x2160, which
     * is 2x a traditional HD 1920x1080 screen which runs at DENSITY_XHIGH.
     */
    public static final int DENSITY_XXXHIGH = 640;           

那麼這些常量具體是用來做些什麼的呢?

我們可以看到注釋:也就是說當手機dpi是120的時候會加載ldpi下的資源,160的時候會加載mhdpi下的資源,以此類推…但是我們在開發中可能并不會真的要建立這6個資源檔案夾,因為這6套資源圖檔檔案所占的容量大小還是不可小觑的,畢竟xxxhdpi中的每張圖檔都不是很小的。

那麼我們在和UI小姐姐要圖的時候該怎麼要呢?相信目前很多開發人員都會用IOS中的@2X的圖檔,為什麼可以直接用IOS的@2X圖檔呢?先來看一下IOS中手機尺寸和分辨率

裝置 螢幕尺寸 分辨率 Reader
iPhone4/4s 3.5 640x960 @2x
iPhone5/5s/5c 4.0 640x1136
iPhone6 4.7 750x1334
iPhone6P 5.5 1242x2208 @3x
iPhone7
iPhone7P
iPhone8
iPhone8P 1080x1920 3x

我們可以看到上面@2x的圖的分辨率都是750x1334,而我們的xhdpi的分辨率為720x1280,相差的不多,是以一般的公司隻按照IOS的UI設計一套UI圖和切圖,而苦逼的Android開發就硬着眉頭上吧。當然如果是一些小的icon的在螢幕适配的時候不适合的話,可以放到mdpi檔案夾中,這個具體細節就得自己去試了。

當然我個人覺得Android有自己的風格,比如Android中的Material Design風格,以及Android中的View,progressbar等等,如果非要為了統一那麼開發人員必定會付出額外的時間去開發UI設計的效果,這樣反倒浪費了時間同時也不能展現出來各個平台的獨有的特性,GoogleIO剛剛結束,Google出品的APP将Android平台的特性展現的淋漓盡緻,當然這些都純屬個人看法,話說回來,那麼就需要UI設計師了解Android和IOS的特性,同時為兩個平台設計各個風格的UI,是以…各自安好

三、轉換關系

Android開發中我們在XML檔案裡面設定高寬度的時候都會進行一次轉換,也就是把非标準尺寸轉換為标準尺寸:

  • dp->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());
  • in->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 20, context.getResources().getDisplayMetrics());
  • mm->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 20, context.getResources().getDisplayMetrics());
  • pt->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, 20, context.getResources().getDisplayMetrics());
  • sp->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.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;  
}            

可以看一下源碼,和我們經常使用的px2dp、sp2px的方法是不是一樣的,原理都是通過擷取手機的DisplayMetrics,然後進行倍數轉換。

四、其他

1.Manifest

在Manifest中添加子元素

android:anyDensity=”true”時,應用程式安裝在不同密度的終端上時,程式會分别加載xxhdpi、xhdpi、hdpi、mdpi、ldpi檔案夾中的資源。

2. .9圖檔

使用圖檔資源時,如果出現拉伸,因為圖檔處理的原因,會變形,導緻界面走形。9-patch PNG圖檔也是一種标準的PGN圖檔,在原生PNG圖檔四周空出一個像素間隔,用來辨別PNG圖檔中哪些部分可以拉伸、哪些不可以拉伸、背景上的邊框位置等。

“上、左”定義可拉伸區域

“右、下”定義顯示區域,如果用到完整填充的背景圖,建議不要通過android:padding來設定邊距,而是通過9-patch方式來定義。

Android SDK中提供了編輯9-Patch圖檔的工具,在tools目錄下draw9patch.bat,能夠立刻看到編輯後的拉伸效果,也可以直接用其他圖檔編輯工具編輯,但是看不到效果。

相關推薦

Android開發:最全面、最易懂的Android螢幕适配解決方案 Android螢幕适配全攻略(最權威的官方适配指導

繼續閱讀