在Android開發中咱們常常看到資源文件下面有這樣六個文件夾,不少人其實並非真正的瞭解它們的意思,爲何會有這6個文件夾?相信大部分人也就知道是爲了屏幕適配,大一點分辨率的圖片放到大的文件夾裏,具體的說一下,首先看一下:html
固然還有xxxhdpi 它的分辨率爲2160x3840,也就是常說的4K屏,目前市場上好像只有一款索尼Xperia Z5 Premium。android
其實這六個密度的圖片文件夾與之對應的是AndroidDisplayMetrics類中的6個常量bash
/**
* 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中的每張圖片都不是很小的。app
那麼咱們在和UI小姐姐要圖的時候該怎麼要呢?相信目前不少開發人員都會用IOS中的@2X的圖片,爲何能夠直接用IOS的@2X圖片呢?先來看一下IOS中手機尺寸和分辨率工具
設備 | 屏幕尺寸 | 分辨率 | Reader |
---|---|---|---|
iPhone4/4s | 3.5 | 640x960 | @2x |
iPhone5/5s/5c | 4.0 | 640x1136 | @2x |
iPhone6 | 4.7 | 750x1334 | @2x |
iPhone6P | 5.5 | 1242x2208 | @3x |
iPhone7 | 4.7 | 750x1334 | @2x |
iPhone7P | 5.5 | 1242x2208 | @3x |
iPhone8 | 4.7 | 750x1334 | @2x |
iPhone8P | 5.5 | 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,因此...各自安好ui
Android開發中咱們在XML文件裏面設置高寬度的時候都會進行一次轉換,也就是把非標準尺寸轉換爲標準尺寸:this
dp->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());spa
in->px: TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 20, context.getResources().getDisplayMetrics());.net
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,而後進行倍數轉換。
在Manifest中添加子元素 android:anyDensity="true"時,應用程序安裝在不一樣密度的終端上時,程序會分別加載xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夾中的資源。
使用圖片資源時,若是出現拉伸,由於圖片處理的緣由,會變形,致使界面走形。9-patch PNG圖片也是一種標準的PGN圖片,在原生PNG圖片四周空出一個像素間隔,用來標識PNG圖片中哪些部分能夠拉伸、哪些不能夠拉伸、背景上的邊框位置等。
「上、左」定義可拉伸區域
「右、下」定義顯示區域,若是用到完整填充的背景圖,建議不要經過android:padding來設置邊距,而是經過9-patch方式來定義。
Android SDK中提供了編輯9-Patch圖片的工具,在tools目錄下draw9patch.bat,可以馬上看到編輯後的拉伸效果,也能夠直接用其餘圖片編輯工具編輯,可是看不到效果。
相關推薦