一、获取屏幕宽高
android获取屏幕的高度和宽度用到WindowManager这个类,两种方法:
//获取windowmanager
WindowManager wm = (WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE);
WindowManager wm = this.getWindowManager();
//第一种
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
//第二种。第一种方法的getWidth已deprecated,改用getSize方法
Point point = new Point();
wm.getDefaultDisplay().getSize(point);
int width = point.x;
int height = point.y;
//第三种。常用方法
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
//第四种
DisplayMetrics dm = getResources().getDisplayMetrics();
int width = dm.widthPixels;
int height= dm.heightPixels;
DP与PX的转换
public static int pxToDp(Context context, float pxValue) {
if (context == null) {
return -1;
}
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
public static int dpToPx(Context context, float dipValue) {
if (context == null) {
return -1;
}
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
根据google的开发文档,理论上dip=pxValue/scale和px=dipValue*scale。但是scale是浮点值,最终程序中需要的一般是int值。java程序的类型转换有精度问题,其中4.1f和4.9f强制转换为int时,值都为4。为了实现常规的四舍五入,这里 加上0.5f来保证强制转换的精度。
在现实中还看到另一种实现方式,其中Resources.getSystem() 可以在任何地方进行调用,但是只能获取系统本身的资源。Math.round则实现了float强制转换int时四舍五入的算法。
private static final float DENSITY = Resources.getSystem().getDisplayMetrics().density;
public static int dp2Px(int dp) {
return Math.round(dp * DENSITY);
}
SP与PX的转换
public static int pxToSp(Context context, float pxValue) {
if (context == null) {
return -1;
}
final float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
return (int)(pxValue / scaledDensity + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*
* @param spValue sp值
* @return context为null,返回-1,否则返回计算后的值
*/
public static int spToPx(Context context, float spValue) {
if (context == null) {
return -1;
}
final float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
return (int)(spValue * scaledDensity + 0.5f);
}