前言
这篇博客主要是介绍如何正确的获取手机屏幕大小以及有虚拟键盘手机的一个小坑。以往我们获取手机屏幕大小的时候都是直接context.getResources().getDisplayMetrics().heightPixels;搞定,这样就能获取到屏幕的高度了,往往可以认为这个尺寸就是屏幕的高度了,我以前同样一直这样认为的,但是!!!前几天发生了一个莫名其妙的bug,这个值比手机屏幕的真实高度短了几十个px!!!其实就是虚拟键盘的高度,在拥有虚拟键盘的手机上(华为),通过上面的方法获取到的高度是不包含虚拟键盘的高度的,这就是经验的重要性啊!!!
工具类
由于对于屏幕尺寸的计算获取是很常用的,所以这个直接给出一个工具类,免得以后重复造轮子以及Google了。
public class ScreenUtil {
/**
* 获取屏幕宽(不含虚拟键盘)
*/
public static int getScrWidth(Context context) {
int widthPixels = context.getResources().getDisplayMetrics().widthPixels;
return widthPixels;
}
/**
* 获取屏幕高(不含虚拟键盘)
*/
public static int getScrHeight(Context context) {
int heightPixels = context.getResources().getDisplayMetrics().heightPixels;
return heightPixels;
}
/**
* 获取屏幕真实高度(包含虚拟键盘)
*/
public static int getScrRealWidth(Context context) {
int px = 0;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
Class c;
try {
c = Class.forName("android.view.Display");
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, displayMetrics);
px = displayMetrics.widthPixels;
} catch (Exception e) {
e.printStackTrace();
}
return px;
}
/**
* 获取屏幕真实高度(包含虚拟键盘)
*/
public static int getScrRealHeight(Context context) {
int px = 0;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
Class c;
try {
c = Class.forName("android.view.Display");
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, displayMetrics);
px = displayMetrics.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
return px;
}
/**
* 获取虚拟键盘高度
*/
public static int getNavigationButtonHeight(Context context) {
return getScrRealHeight(context) - getScrHeight(context);
}
/**
* 获取虚拟键盘的宽度
*/
public static int getNavigationButtonWidth(Context context) {
return getScrRealWidth(context) - getScrWidth(context);
}
/**
* 获取状态栏高度
*/
public static int getTitleBarHeight(Context context) {
int statusHeight = -1;
try {
Class clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
int height = Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
return statusHeight;
}
}
再说点什么
看的出来,这篇博客很短,是的,真的很短,一个工具类而已,对于一篇博客来说也太轻量级了,所以下一篇博客就来点干货了。介绍下安卓的事件注入相关吧
Resources.getSystem().getDisplayMetrics().widthPixels
支持下