在开发中遇到了需要获取屏幕参数的各种场景,其中也存在很多漏洞,所以现在就记录如何获取这些参数。 避免再入基坑。
物理屏幕宽度的高度
一.底部无虚拟按钮
这里得到的宽度的高度是你看得见的、屏幕点亮的地方的宽度的高度。
//*
*获取屏幕宽度
*
* @param context
* @return
*/
publicstaticintgetscreenwidth (上下文上下文) {
windowmanagerWM=(windowmanager ) context.getsystemservice (context.window _ service );
displaymetricsdm=newdisplaymetrics (;
wm.getDefaultDisplay ().getmetrics ) ) DM;
return dm.widthPixels;
}
//*
获取屏幕的高度
*
* @param context
* @return
*/
publicstaticintgetscreenheight (上下文上下文) {
windowmanagerWM=(windowmanager ) context.getsystemservice (context.window _ service );
displaymetricsdm=newdisplaymetrics (;
wm.getDefaultDisplay ().getmetrics ) ) DM;
return dm.heightPixels;
}
二.底部有虚拟按钮
华为在手机底部有一个黑色的虚拟按钮(NavigationBar )。 通过以上方法得到的画面高度是画面的真实高度-虚拟按钮的高度。 所以,如果有虚拟键,获取屏幕高度是另一种方法。
publicstaticintgetrealheight (上下文上下文) {
windowmanagerWM=(windowmanager ) context.getsystemservice (context.window _ service );
display display=WM.getdefaultdisplay (;
int screenHeight=0;
if (build.version.SDK _ int=build.version _ codes.jelly _ bean _ mr1 ) {
displaymetricsdm=newdisplaymetrics (;
display.getrealmetrics(DM );
screenHeight=dm.heightPixels;
也可以使用//或getRealSize方法
//Point size=new Point (;
//display.getrealsize(size;
//screenHeight=size.y;
} else if (build.version.SDK _ int=build.version _ codes.ice _ cream _ sandwich ) {
try {
screenheight=(integer ) display.class.get method (getrawheight ).invoke ) display );
}catch(exceptione ) {
displaymetricsdm=newdisplaymetrics (;
display.getmetrics(DM );
screenHeight=dm.heightPixels;
}
}
return screenHeight;
}
虚拟键的高度
可以通过读取Android系统大小资源中定义的navigation_bar_height来获取虚拟密钥(NavigationBar )的高度。
因此,无论虚拟按钮是可见还是隐藏,获得的结果都是相同的。
publicstaticintgetnavigationbarheight (上下文上下文) {
int navigationBarHeight=-1;
资源资源=context.get resources (;
int resourceid=resources.get identifier (' navigation _ bar
_height","dimen", "android");if (resourceId > 0) {
navigationBarHeight = resources.getDimensionPixelSize(resourceId);
}
return navigationBarHeight;
}
状态栏高度
状态栏就是屏幕顶部显示时间,电池,wifi 等信息的栏目。
方法一:系统提供了一个Resource类,通过这个类可以获取资源文件,借此可以获取 到status_bar_height 。
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
方法2: 通过反射
Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,然后找 status_bar_height。
public void getStatusBarHeightByReflect() {
int statusBarHeight2 = -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());
statusBarHeight2 = getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
Log.e(TAG, "状态栏高度-反射方式:" + statusBarHeight2);
}
借助应用区 top 属性。
状态栏位于屏幕的最顶端,坐标从 (0,0) 开始,所以应用区的顶部的位置就是状态栏的高度。
/**
* 应用区的顶端位置即状态栏的高度
* *注意*该方法不能在初始化的时候用
* */
public void getStatusBarHeightByTop() {
Rect rectangle = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
Log.e(TAG, "状态栏高度-应用区顶部:" + rectangle.top);
}
应用区域高度
除去状态栏剩下的都时应用区。由此可知屏幕的高度 - 状态栏高度 = 应用区的高度。
/**
* 不能在 onCreate 方法中使用。
* 因为这种方法依赖于WMS(窗口管理服务的回调)。正是因为窗口回调机制,所以在Activity初始化时执行此方法得到的高度是0。
* 这个方法推荐在回调方法onWindowFocusChanged()中执行,才能得到预期结果。
*/
public void getAppViewHeight(){
//屏幕
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//应用区域
Rect outRect1 = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
int statusBar = dm.heightPixels - outRect1.height(); //状态栏高度=屏幕高度-应用区域高度
Log.e(TAG, "应用区高度:" + statusBar);
}
setContentView 高度,view 显示的高度
需要在见面创建后才能获取到。
public static int getContentViewHeight(Activity activity) {
Rect rectangle= new Rect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rectangle);
return rectangle.height();
}
标题栏高度
标题栏高度 = 应用区高度 - view 显示高度
public static void getTitleBarHeight(Activity activity) {
Rect outRect1 = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
int viewTop = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //要用这种方法
int titleBarH = viewTop - outRect1.top;
Log.e(TAG, "标题栏高度-计算:" + titleBarH);
}