开发过程中,动态创建布局,或者自定义view,少不了需要获取屏幕宽高,这里的宽高指手机屏幕的分辨率,单位是px,而我们在布局文件中用到的空间宽高单位是dp,字体用的是sp。
这几个计量单位之间,是有关联的,比如dp与px,是通过density来相互转化的,px跟sp则通过scaledDensity来相互转化,类似于小学的除数、被除数、商,三者之间的关系。
关于以上的内容,下面统一写在一个工具类里面,用的时候之间调用相应方法即可,代码如下
public class DisplayUtil {
public static int pxTodp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
public static int dpTopx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static int pxTosp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
public static int spTopx(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
public static int dpTopx(Context context, int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
context.getResources().getDisplayMetrics());
}
public static int spTopx(Context context, int sp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
context.getResources().getDisplayMetrics());
}
public static int screenWidth(Context context) {
return ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getWidth();
}
public static int screenHeight(Context context) {
return ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getHeight();
}
public static int getViewHeight(View views) {
int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
views.measure(spec, spec);
int measuredWidthTicketNum = views.getMeasuredHeight();
return measuredWidthTicketNum;
}
}