前导
先介绍下基本的属性值
width: 屏幕的宽度
height:屏幕的高度
xdpi:屏幕宽度方向的dpi
ydpi:屏幕高度方向的dpi
density:屏幕整体的dpi
fdensity:dpi与标准像素密度(160dpi)比值
sdensity:字体缩放比例(个人感觉就是fdensity)
这篇文章衔接与android 冷知识 像素博客遗留的问题做出解释
基础的获得屏幕尺寸
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
double xdpi=metrics.xdpi;
double ydpi=metrics.ydpi;
int density = metrics.densityDpi;
double fdensity = metrics.density;
double sdensity = metrics.scaledDensity;
这个方法有一定的缺陷,当手机有导航栏时;获取的高度会规避导航栏的高度
在有导航栏下获得全部高度
Context context = getApplicationContext();
DisplayMetrics dm = new DisplayMetrics();
WindowManager windowMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
windowMgr.getDefaultDisplay().getRealMetrics(dm);
int height2 = dm.heightPixels;
int width2 = dm.widthPixels;
double xdpi2=dm.xdpi;
double ydpi2=dm.ydpi;
int density2 = dm.densityDpi;
double fdensity2 = dm.density;
double sdensity2 = dm.scaledDensity;
// 这样可以计算屏幕的物理尺寸
float width2 = (width / xdpi)*(width / xdpi);
float height2 = (height / ydpi)*(width / xdpi);
在这个方法中主要是在WindowManager中增加了一个属性getSystemService(Context.WINDOW_SERVICE),通过这个属性就可以完整的去获取手机的像素。
获得手机的状态栏的高度
方法一
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
这个方法在很多情况下都是不生效的,
方法二_有效方法
public float getStatusBarHeight() {
float result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimension(resourceId);
}
return result;
}
方法三_有效方法
public static int getStatusHeight(Activity activity){
int statusHeight = 0;
Rect localRect = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect);
statusHeight = localRect.top;
if (0 == statusHeight){
Class<?> localClass;
try {
localClass = Class.forName("com.android.internal.R$dimen");
Object localObject = localClass.newInstance();
int i5 = Integer.parseInt(localClass.getField("status_bar_height").get(localObject).toString());
statusHeight = activity.getResources().getDimensionPixelSize(i5);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
return statusHeight;
}
获取导航栏的高度
public float getNavigationBarHeight() {
float result = 0;
int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimension(resourceId);
}
return result;
}
承接以前博客
1.dp与px之间的关系
public static int dpToPixels(Context context , float dp){
float density = context.getResources().getDisplayMetrics().density;
return (int)Math.ceil(dp * density);
2.sp与px之间的关系
/**
* Pixels 转 SP
*/
public static float pixelsToSp(Context context, float px) {
float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
return px/scaledDensity;
}
/**
* SP 转 Pixels
*/
public static float spToPixels(Context context, float sp) {
float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
return sp * scaledDensity;
}
安卓源码
public void setTo(DisplayMetrics o) {
this.widthPixels = o.widthPixels;
this.heightPixels = o.heightPixels;
this.density = o.density;
this.densityDpi = o.densityDpi;
this.scaledDensity = o.scaledDensity;
this.xdpi = o.xdpi;
this.ydpi = o.ydpi;
this.noncompatWidthPixels = o.noncompatWidthPixels;
this.noncompatHeightPixels = o.noncompatHeightPixels;
this.noncompatDensity = o.noncompatDensity;
this.noncompatScaledDensity = o.noncompatScaledDensity;
this.noncompatXdpi = o.noncompatXdpi;
this.noncompatYdpi = o.noncompatYdpi;
}
public void setToDefaults() {
this.widthPixels = 0;
this.heightPixels = 0;
this.density = (float)DENSITY_DEVICE / 160.0F;
this.densityDpi = DENSITY_DEVICE;
this.scaledDensity = this.density;
this.xdpi = (float)DENSITY_DEVICE;
this.ydpi = (float)DENSITY_DEVICE;
this.noncompatWidthPixels = 0;
this.noncompatHeightPixels = 0;
}