关于Android手机屏幕宽高

获取屏幕的宽高,通常方法如下几种:

// 获取屏幕密度(一)

Display display = getActivity().getWindowManager().getDefaultDisplay();

int screenWidth = display.getWidth(); // 屏幕宽

int screenHeight = display.getHeight(); // 屏幕高
// 获取屏幕密度(二)
DisplayMetrics dm = getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels; // 屏幕宽
int screenHeight = dm.heightPixels; // 屏幕高
// 获取屏幕密度(三)
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels; // 屏幕宽
int screenHeight = dm.heightPixels; // 屏幕高


但是这几个方法有点问题,正常的手机没毛病,但是android4.0之后有了虚拟按键,有虚拟按键的系统调用上面的方法尺寸会减去虚拟按键的尺寸,一个1080*1920的手机根据以上方法计算的高度会比1920少。

解决方法如下(计算结果就是1920):
API 17 之后提供了方法
DisplayMetrics dm = new DisplayMetrics();  
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
int width = dm.widthPixels;  // 屏幕宽
int height = dm.heightPixels;  // 屏幕高

在API 17之前通过反射获取

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
    c = Class.forName("android.view.Display");
    @SuppressWarnings("unchecked")
    Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
    method.invoke(display, dm);
}catch(Exception e){
    e.printStackTrace();
}
int width = dm.widthPixels;
int height = dm.heightPixels;

你可能感兴趣的:(关于Android手机屏幕宽高)