Android 开发笔记 UI篇-获取屏幕宽高
直接贴上工具类代码,希望能帮到需要的人,请详细看下代码注释
public class ScreenUtil {
// ---------------------------第一种方式---------------------------------------
/**
* 获取屏幕高度
* 注意:
* 1. 无虚拟导航栏的手机上,返回的高度值(包含状态栏);
* 2. 有虚拟导航栏的手机上,可能根据虚拟导航栏是否展示,返回高度值不一样
* PS:之所有加可能,实测了Mi 8 SE 和华为P9
* 1. 实测 Mi 8 SE,无论虚拟导航栏展示与否,getScreenHeight()都返回的是不包括导航栏的高度值
* 2. 实测 hua wei P9,会根据导航栏展示与否,getScreenHeight()返回的高度值是根据导航栏展示就包括,不展示就不包括的逻辑
* @return
*/
public static int getScreenHeight() {
DisplayMetrics metric = Resources.getSystem().getDisplayMetrics();
return metric.heightPixels;
}
/**
* 屏幕宽度(像素)
*
* @return
*/
public static int getScreenWidth() {
DisplayMetrics metric = Resources.getSystem().getDisplayMetrics();
return metric.widthPixels;
}
// -------------------------------第二种方式--------------------------------
/**
* @param context
* @return 获取屏幕实际高度(包括导航栏 , 状态栏)
*/
public static int getScreenRealH(Context context) {
DisplayMetrics dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(dm);
return dm.heightPixels;
}
/**
* @param context
* @return 获取屏幕实际宽度
*/
public static int getScreenRealW(Context context) {
DisplayMetrics dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(dm);
return dm.widthPixels;
}
// ------------------------------第三种方式-------------------------------
/**
* @return 获取屏幕原始尺寸高度,包括虚拟功能键高度
*/
@Deprecated
public static int getRealScreenHeight(Context context) {
int dpi = 0;
Display display = ((Activity) (context)).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);
dpi = dm.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
/**
* @return 获取屏幕原始尺寸高度,包括虚拟功能键高度
*/
@Deprecated
public static int getRealScreenWidth(Context context) {
int dpi = 0;
Display display = ((Activity) (context)).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);
dpi = dm.widthPixels;
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
// -----------------------------获取状态栏高度--------------------------------
/**
* 获得状态栏的高度
*
* @param context
* @return
*/
public static int getStatusHeight(Context context) {
int statusHeight = 0;
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;
}
/**
* @param context
* @return 获得状态栏的高度
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources()
.getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT ? result : 0;
}
// -------------------------------获取导航栏高度--------------------------------
/**
* 获取导航栏高度
*
* @param context
* @return
*/
public static int getNavigatorHeight(Context context) {
int rid = context.getResources()
.getIdentifier("config_showNavigationBar", "bool", "android");
if (rid != 0) {
int resourceId = context.getResources()
.getIdentifier("navigation_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
} else
return 0;
}
// -------------------------------------------------------------------------
/**
* @param context
* @return 导航栏是否展示出来了 (此种方式判断不可靠)
*/
@Deprecated
public static boolean isNavBarShowing(Context context) {
return ((getScreenRealH(context) - getScreenHeight()) > 0);
}
public static float getDensity() {
return Resources.getSystem().getDisplayMetrics().density;
}
public static float getDensityDpi() {
return Resources.getSystem().getDisplayMetrics().densityDpi;
}
}