apk的資源包中
當屏幕density=240時,使用hdpi 標簽的資源 當屏幕density=160時,使用mdpi標簽的資源 當屏幕density=120時,使用ldpi標簽的資源。 不加任何標簽的資源是各種分辨率情況下共用的。 布局時盡量使用單位dip,少使用px
dp與px換算公式:
pixs =dips * (densityDpi/160).
dips=(pixs*160)/densityDpi
/**
* 根據手機的分辨率從 dp 的單位 轉成為 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
dp與px轉換的方法:
public static int dip2px(Context context, float dipValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale +0.5f); }
public static int px2dip(Context context, float pxValue){ final float scale = context.getResource().getDisplayMetrics().density; return (int)(pxValue / scale +0.5f); }
名詞 |
解釋 |
Px (Pixel像素) |
不同設備顯示效果相同。這里的“相同”是指像素數不會變,比如指定UI長度是100px,那不管分辨率是多少UI長度都是100px。也正是因為如此才造成了UI在小分辨率設備上被放大而失真,在大分辨率上被縮小。 |
Screen Size (屏幕尺寸) |
一般所說的手機屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的對角線的長度,而不是手機面積。我們可以根據勾股定理獲取手機的寬和長,當然還有面積。 |
Resolution (分辨率) |
指手機屏幕垂直和水平方向上的像素個數。比如分辨率是480*320,則指設備垂直方向有480個像素點,水平方向有320個像素點。 |
Dpi (dots per inch 像素密度) |
指每英寸中的像素數。如160dpi指手機水平或垂直方向上每英寸距離有160個像素點。假定設備分辨率為320*240,屏幕長2英寸寬1.5英寸,dpi=320/2=240/1.5=160 注意:該值對應於DisplayMetrics類中屬性densityDpi的值 |
Density (密度) |
指每平方英寸中的像素數。 Density=Resolution/Screen size 注意:在DisplayMetrics類中屬性density的值為dpi/160,可用於px與dip的互相轉換 |
Dip (Device-independent pixel,設備獨立像素) |
同dp,可作長度單位,不同設備有不同的顯示效果,這個和設備硬件有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。dip和具體像素值的對應公式是dip值 =設備密度/160* pixel值,可以看出在dpi(像素密度)為160dpi的設備上1px=1dip |
Sp (ScaledPixels 放大像素) |
主要用於字體顯示(best for textsize)。根據 google 的建議,TextView 的字號最好使用 sp 做單位,而且查看TextView的源碼可知 Android 默認使用 sp 作為字號單位。 |