前言:本来准备好的素材不小心删除了,所以这里就只能简单的描述一下了!
1、Android中DisplayMetrics类记录了屏幕的基本信息,通常可以使用一下方法获得
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
// 或者
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
该类的toString()可以看到它的组成,具体的我就不用多说了,SDK和网上一大堆解释。
public String toString() {
return "DisplayMetrics{density=" + density + ", width=" + widthPixels +
", height=" + heightPixels + ", scaledDensity=" + scaledDensity +
", xdpi=" + xdpi + ", ydpi=" + ydpi + "}";
}
2、在使用DisplayMetrics获取数据的时候需要搞清楚一下几点:
1)屏幕分辨率:通俗的讲就是横竖的点。如240px * 320px
2)屏幕尺寸:屏幕对角线的长度,用inch计算。如4英寸,长宽是不定的。
3)DPI:每平方英寸显示的点。如 (240 * 320) / 1.5 * 2 = 25600。开方就是160
android默认把160作为标准,这样算出来的density为1。如果是120那density = 0.75
值得关注的是android同时也提供了几个dpi的标准:
public static final int DENSITY_LOW = 120;
/**
* Standard quantized DPI for medium-density screens.
*/
public static final int DENSITY_MEDIUM = 160;
public static final int DENSITY_TV = 213;
/**
* 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;
所以在我们的android工程中就有ldpi、mdpi、hdpi等等。android会根据当前屏幕信息到合适的文件夹寻找图片。
3、那么这样做有什么好处呢?很显然Google在屏幕的分辨率、尺寸上建立了密度的概念,这样就可以兼顾屏不同屏幕的指标而做出相同的设计。
首先要明确的是虽然我们平时使用dip(dp)指定长度,但最终画到屏幕上的还是px,然而dp的值是通过:dp = px/density (px = dp * density)计算得来的。
如marginLeft = 20dp
在320px * 480px 和 density = 1 的设备上 px = 20 占用屏幕的 20 / 320 = 1/ 16
在480px * 800px 和 density = 1.5的设备上px = 30 占用屏幕的 30 / 480 = 1/ 16
所以看起来是一样大小的
4、density是有手机厂商自己指定的,android系统会到文件中读取,hw_lcd_density = 240等