DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidthPx = dm.widthPixels;
int screenHeighPx = dm.heightPixels;
int virtualKeyHeight = 0;
Resources res = getResources();
int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0)
virtualKeyHeight = res.getDimensionPixelSize(resourceId);
float density = getResources().getDisplayMetrics().density;
int screenWidthDp = (int) (screenWidthPx / density + 0.5f);
int screenHeighDp = (int) ((screenHeighPx + virtualKeyHeight) / density + 0.5f);
Log.i(TAG, "屏幕宽:" + screenWidthPx + "px,屏幕高:" + screenHeighPx + "px,虚拟键高:" + virtualKeyHeight + "px");
Log.i(TAG, "屏幕宽:" + screenWidthDp + "dp,屏幕高:" + screenHeighDp + "dp,density:" + density);
分别在三款手机上运行出的结果:
屏幕宽:360dp,屏幕高:720dp,density:2.0
(4):主屏尺寸:英寸。主屏分辨率:1280x640像素
屏幕宽:640px,屏幕高:1184px,虚拟键高:96px
屏幕宽:320dp,屏幕高:640dp,density:2.0
假设手机屏幕宽度是screenWidthIn英寸,手机屏幕宽有screenWidthPx个像素点,那么像素密度ppi为screenWidthPx / screenWidthIn,所以手机屏幕宽的总dp值是160 x screenWidthPx / ppi即screenWidthIn x 160 。所以屏幕宽2英寸的手机宽320dp,1dp = 1/160英寸,以此类推。
sp x ppi / 160 = px
按照像素密度等于每英寸的像素数的算法,将1280的平方和720的平方之和开方后,再除以5.2英寸,结果约等于282.4,并非density:2.0乘以160即320的结果。所以一般手机代码算出来的结果会是2.0x160、1.75x160、1.5x160、1x160等之间的数,不是精确的每英寸像素数。
分辨率为1280x720像素(屏幕宽:360dp)的手机,可通过 adb shell wm size 640x1280 命令,改成了屏幕宽:320dp。此时手机上的效果会是:可见屏幕的物理尺寸变小。设置后输入如下结果:
屏幕宽:640px,屏幕高:1184px,虚拟键高:96px
屏幕宽:320dp,屏幕高:640dp,density:2.0
也可以再设置回adb shell wm size 720x1280,通过adb shell wm density 360,改成了屏幕宽:320dp。方便测试不同尺寸的屏幕适配问题。此时手机上的效果会是:activity的内容会显示不全,最右边部分内容被挤出屏幕外。设置后输入如下结果:
屏幕宽:720px,屏幕高:1184px,虚拟键高:108px
屏幕宽:320dp,屏幕高:574dp,density:2.25
输入命令adb shell dumpsys window displays或adb shell wm size会得到屏幕分辨率,dp值,虚拟键高度等。
屏幕适配方法一,在app下的res下建立values-1184x640等不同分辨率的文件夹(本身是1280x640,按上述方法打印出来的屏幕高:1184px),再建dimens.xml文件,编写1280x640标准下的dp值。针对图片则建drawable-hdpi-1184x640等文件夹,放图片。
屏幕适配方法二,在app下的res下建立values-sw320dp等文件夹(指1280x640px算下来的屏幕宽是320dp),再建dimens.xml文件,编写1280x640标准下的dp值。针对图片则建drawable-sw320dp-hdpi、drawable-sw320dp-xhdpi等文件夹,放图片。
sp与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时,1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=1英寸/160dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。