DisplayMetrics类是获取手机屏幕各种属性的关键类。
一、获取手机屏幕的分辨率:
1.通过WindowManager获取
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//屏幕宽度
int widthPixels = dm.widthPixels;
//屏幕高度
int heightPixels = dm.heightPixels;
2.通过Resources获取
DisplayMetrics dm = getResources().getDisplayMetrics();// 通过Resources获取
//屏幕宽度
int widthPixels = dm.widthPixels;
//屏幕高度
int heightPixels = dm.heightPixels;
3.获取屏幕的默认分辨率
Display display = getWindowManager().getDefaultDisplay();// 获取屏幕的默认分辨率
//屏幕宽度
int widthPixels = display.getWidth();//getWidth和下面的getHeight在API 13中已经被弃用了,应该用getSize(Point p)来代替
//屏幕高度
int heightPixels = display.getHeight();
二、获取手机屏幕的dip:
首先要知道,dp与px的区别:
px就是像素,这是一个物理单位,在不同的屏幕上,同样大小的像素,显示出来的大小可能不同。
而dp(dpi)是一种相对的单位,叫做像素密度,在每英寸160点的显示器上,1dp = 1px。
DisplayMetrics dm = getResources().getDisplayMetrics();// 通过Resources获取
int widthPixels = dm.widthPixels;//屏幕宽度(px)
int heightPixels = dm.heightPixels;//屏幕高度(px)
Log.d("width:", widthPixels+"");
Log.d("height:", heightPixels+"");
float density = dm.density;//屏幕密度(0.75 / 1.0 / 1.5),每个dpi有多少像素
int densityDpi = dm.densityDpi;// 屏幕密度dpi(120/160/240/400),每英寸有多少像素
float xdpi = dm.xdpi;//X轴方向的每英寸的dpi数 该值*该方向的英寸数等于该方向的像素数
float ydpi = dm.ydpi;//Y轴方向的每英寸的dpi数 该值*该方向的英寸数等于该方向的像素数
Log.d("density", String.valueOf(density));//1dpi的像素数
Log.d("densityDpi", String.valueOf(densityDpi));//每英寸有多少像素
Log.d("xdpi", String.valueOf(xdpi));
Log.d("ydpi", String.valueOf(ydpi));
经测试,我的手机(nubia Z7 max 1080p 5.5寸)
宽2.7寸 长4.8寸 写对角线正好5.5寸
也就是说,我的手机屏幕,1dp =2.5px
获取X轴和Y轴方向的dpi数,只要将上面的xdpi乘以该方向的实际物理英寸,y轴同理。
三、获取手机屏幕的大小(具体的尺寸):
用该方向的像素除以该方向的densityDpi,就可以得到该方向的实际英寸了
DisplayMetrics dm = getResources().getDisplayMetrics();// 通过Resources获取
float density = dm.density;//屏幕密度(0.75 / 1.0 / 1.5),每个dpi有多少像素
int densityDpi = dm.densityDpi;// 屏幕密度dpi(120/160/240/400),每英寸有多少像素
float xInch = dm.widthPixels * 1.0f / densityDpi;
float yInch = dm.heightPixels * 1.0f / densityDpi;
Log.d("X inch:", xInch+"");
Log.d("Y inch:", yInch+"");
如要在开发过程中,要在px和dp之间进行转换,可以使用如下的工具类:
package com.learn.protection;
import android.content.Context;
import android.util.DisplayMetrics;
import android.util.Log;
/**
* Created by KalinaRain on 2015/4/12.
*/
public class DensityUtil {
private static final String TAG = DensityUtil.class.getSimpleName();
private static DisplayMetrics dm;
private static float dmDensity = 0.0f;// 当前屏幕的densityDpi
private static float dmDensityDpi = 0.0f;// 当前屏幕的densityDpi
private static float scale = 0.0f;//也就是dm.density
/**
* 根据构造函数获得当前手机的屏幕系数
*/
public DensityUtil(Context context) {
// 获取当前屏幕
dm = context.getApplicationContext().getResources().getDisplayMetrics();
// 设置Density
setDmDensity(dm.density);
// 密度因子
scale = getDmDensity();//density = dm.densityDpi/160
dmDensityDpi = dm.densityDpi;//每英寸含有的像素数
Log.i(TAG, toString());
}
/**
* 获取当前屏幕的density
*/
public static float getDmDensity() {
return dmDensity;
}
/**
* 设置当前屏幕的density
*/
public static void setDmDensity(float dmDensity) {
DensityUtil.dmDensity = dmDensity;
}
/**
* dpi转换像素
*/
public static int dip2px(float dipValue) {
return (int) (dipValue * scale + 0.5f);
}
/**
* 像素转换dpi
* */
public int px2dip(float pxValue) {
return (int) (pxValue / scale + 0.5f);
}
@Override
public String toString() {
return " dmDensity:" + dmDensity + " dmDensityDpi:" + dmDensityDpi;
}
}