Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系

目录

  • 正确获取屏幕分辨率
    • 代码:
    • getMetrics和getRealMetrics的区别
    • 扩展知识
  • 单位关系
    • 概念
    • 关系

正确获取屏幕分辨率

代码:

DisplayMetrics dm =new DisplayMetrics();
WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
manager.getDefaultDisplay().getRealMetrics(dm);
int widthPixels = dm.widthPixels;//单位为像素 px
int height = dm.heightPixels;//单位为像素 px
float density = dm.density;
float scaledDensity = dm.scaledDensity;
int densityDpi = dm.densityDpi;

getMetrics和getRealMetrics的区别

  1. getMetrics()获取的Activity实际屏幕信息,而getRealMetrics()获取系统的屏幕信息.getMetrics()随着Activity的大小变化.而getRealMetrics()则是不变的.
    例如:800*1280的设备,使用设备的分屏功能将Activtiy大小设置为一半.
    getRealMetrics()获取的信息:w=800 h=1280 density=1.125 scaledDensity=1.125 densityDpi=180 x=213.0 y=213.0
    getMetrics()获取信息:test: w=800 h=593 density=1.125 scaledDensity=1.125 densityDpi=180 x=213.0 y=213.0
  2. Activity全屏下,getRealMetrics()和getMetrics()获取到的屏幕信息差别只在于widthPixels或heightPixels的值是否去除虚拟键所占用的像素,和是否全屏和沉浸模式无关.
    例如: 800*1280的设备,Activtiy全屏.
    getRealMetrics()获取的信息:w=800 h=1280 density=1.125 scaledDensity=1.125 densityDpi=180 x=213.0 y=213.0
    getMetrics()获取信息:test: w=800 h=1226 density=1.125 scaledDensity=1.125 densityDpi=180 x=213.0 y=213.0
    相差的值就是设备底部的导航栏的高度(px),如果设备设置全屏或取消导航栏,getMetrics()输出的结果还是h=1226.

扩展知识

windowManager:是一个接口,用来管理窗口的。
获取方式有3种,效果都一样:

1.使用android.app.Activity#getWindowManager.	WindowManager wm=getWindowManager()
2.使用android.view.Window#getWindowManager.	WindowManager wm=getwindow.getWindowManager();
3.使用Activity的getSystemService(WINDOW_SERVICE)方法.	WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
4.  WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

在adapter中:
DisplayMetrics dm =context. getResources().getDisplayMetrics();//和getMetrics()一样效果,去除了虚拟键所占像素
int widthPixels = dm.widthPixels;//单位为像素 px
//也可以用方法4.

单位关系

概念

  1. 像素(px):手机屏幕的最小构成单元;单位为px,1px=1像素点.
  2. 设备独立像素(dp或者dip):也交密度无关像素,在不同的像素密度的设备上会自动适配.
  3. 字体像素(sp):主要用于字体显示.
  4. 分辨率(px):一般描述为横向像素点个数x纵向像素点个数,例如上面的8001280(宽高),单位同像素一样.
  5. 屏幕尺寸:手机对角线的物理尺寸;单位:英寸(inch),一英寸约等于2.54cm.
  6. 屏幕像素密度(densityDpi或者dpi):也叫密度值和ppi,每英寸的像素点数.一般设备是有预设值的,对应的不同的分辨率.
  7. density密度:也叫做基准比例 ,表示dp到px的变换系数.

关系

  1. density=dpi/160,160像素/英寸是android定义的一个标准. 以上面数据: 1.125=180/160
  2. dp=px/density.
  3. sp=px/density.
    在做UI设计时,设计师给出的切图如下:
    Android屏幕分辨率正确获取及PX,DPI,DP,SP等的对应关系_第1张图片
    为了自动适配不同的设备,需要换算成dp,sp使用,即字体用sp,其他用dp为单位;
    所以XML中Button的width=75/1.125=67dp; height=240/1.125=213dp; textSize=30/1.125=27sp.

你可能感兴趣的:(XML,Android,android,安卓)