Android 获取屏幕尺寸和密度

//获取屏幕大小(弃用)
intscreenWidth = getWindowManager().getDefaultDisplay().getWidth();//屏幕宽(像素,如:480px
intscreenHeight = getWindowManager().getDefaultDisplay().getHeight();//屏幕高(像素,如:800p
Log.e("Tag","屏幕宽度:"+ screenWidth + ",屏幕高度:"+ screenHeight);
Log.e("TAG","---------------------------------------------------------");

//获取屏幕大小(方法1
//1.获取窗口管理器
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
//2.获取默认显示设备 或称之为 得到当前屏幕的显示器对象
Display display = wm.getDefaultDisplay();
//3.创建一个Point点对象用来接收屏幕尺寸信息
Point point =newPoint();
//4.Point点对象接收当前设备屏幕尺寸信息
display.getSize(point);
//Point点对象中获取屏幕的宽度(单位像素)
intwidth = point.x;
//Point点对象中获取屏幕的高度(单位像素)
intheight = point.y;
Log.e("TAG","屏幕宽度:"+ width + ",屏幕高度:"+ height);
Log.e("TAG","---------------------------------------------------------");


//获取屏幕大小和密度(方法2
DisplayMetrics dm = getResources().getDisplayMetrics();
intwScreen = dm.widthPixels;
inthScreen = dm.heightPixels;
floatdensity = dm.density;
intdensityDpi = dm.densityDpi;

intmScreenWidth = (int) (wScreen * density +0.5f);
intmScreenHeight = (int) (hScreen * density +0.5f);
Log.e("TAG","屏幕宽度 dip:"+ wScreen +",屏幕高度 dip:"+ hScreen +",屏幕密度(ratio,以160dpi为基准):"+ density + ",屏幕密度:"+ densityDpi);
Log.e("TAG","xdpi:"+ dm.xdpi+ ",ydpi:"+ dm.ydpi);
Log.e("TAG","屏幕宽度 px:"+ mScreenWidth +",屏幕高度 px:"+ mScreenHeight);
Log.e("TAG","---------------------------------------------------------");

//获取屏幕大小和密度(方法3
DisplayMetrics newDm =newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(newDm);
intmWidthScreen = newDm.widthPixels;
intmHeightScreen = newDm.heightPixels;
floatmDensity = newDm.density;
intmDensityDpi = newDm.densityDpi;

intdmScreenWidth = (int) (mWidthScreen * mDensity +0.5f);
intdmScreenHeight = (int) (mHeightScreen * mDensity +0.5f);
Log.e("TAG","屏幕宽度 dip:"+ mWidthScreen +",屏幕高度 dip:"+ mHeightScreen +",屏幕密度(ratio,以160dpi为基准):"+ mDensity + ",屏幕密度:"+ mDensityDpi);
Log.e("TAG","屏幕宽度 px:"+ dmScreenWidth +",屏幕高度 px:"+ dmScreenHeight);
Log.e("TAG","xdpi(dpi):"+ newDm.xdpi+ ",ydpi(dpi):"+ newDm.ydpi);

测试结果:
TAG: 屏幕宽度:1080,屏幕高度:1800
TAG: ---------------------------------------------------------
TAG: 屏幕宽度:1080,屏幕高度:1800
TAG: ---------------------------------------------------------
TAG: 屏幕宽度 dip:1080,屏幕高度 dip:1800,屏幕密度(ratio,以160dpi为基准):3.0,屏幕密度:480
TAG: xdpi:370.702,ydpi:369.454
TAG: 屏幕宽度 px:3240,屏幕高度 px:5400
TAG: ---------------------------------------------------------
TAG: 屏幕宽度 dip:1080,屏幕高度 dip:1800,屏幕密度(ratio,以160dpi为基准):3.0,屏幕密度:480
TAG: 屏幕宽度 px:3240,屏幕高度 px:5400
TAG: xdpi(dpi):370.702,ydpi(dpi):369.454

前两种方法仅仅获取 屏幕的分辨率(单位为dip:device independent pixels,像素无关密度/设备独立像素),后两种方法不仅可以获取屏幕的分辨率还可以获取密度,有了密度你就可以计算屏幕的实际物理像素
此外,你还能获取到 X维度或Y维度中屏幕每英寸的精确物理像素点。

你还可以发现,使用DisplayMetrics实例对象以及获取WindowManager对象,可以使用多种方式:
1.DisplayMetrics dm = getResources().getDisplayMetrics();
2.DisplayMetrics newDm =newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(newDm);

1.WindowManager wm = (WindowManager)
2.getSystemService(WINDOW_SERVICE);
WindowManager windowManager=getWindowManager();

另外介绍一下dp(dip)与px的转换关系:
/**
*根据手机的分辨率从dp的单位 转成为px(像素)
*/
public static intdip2px(Context context,floatdpValue) {
final floatscale = context.getResources().getDisplayMetrics().density;
return(int) (dpValue * scale +0.5f);
}

/**
*根据手机的分辨率从px(像素)的单位 转成为dp
*/
public static intpx2dip(Context context,floatpxValue) {
final floatscale = context.getResources().getDisplayMetrics().density;
return(int) (pxValue / scale +0.5f);
}

dp与px换算时为什么要加0.5f?
DisplayMetrics.density 字段根据当前屏幕密度指定 将 dp 单位转换为像素必须使用的缩放系数。 在中密度屏幕上,DisplayMetrics.density 等于 1.0;在高密度屏幕上,它等于 1.5;在超高密度屏幕上,等于 2.0; 在低密度屏幕上,等于 0.75。此数字是一个系数,应用其乘以 dp 单位以获取用于当前屏幕的实际像素数。(然后在转换时加上 0.5f,将该数字四舍五入到最接近的整数。)如需了解 详细信息,请参阅 DisplayMetrics 类。”

dpi与ppi的区别?
另外我们所说的dpi(dots per intch),实际上为ppi(pixels per inch),但我们一般是混用的,但常用dpi。
发布了19 篇原创文章 · 获赞 0 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ds19920925/article/details/75090311