Android实现屏幕各尺寸的获取的示例
在开发中我们会遇到各种需要获得屏幕参数的场景,当中也有不少坑,所以现在就记录一下这些参数的获取方式。以免再入坑。
物理屏幕宽高
一、底部没有虚拟按键
这里获取到的宽高,就是你眼睛能看到的,屏幕亮着的地方的宽高。
/**
*获取屏幕的宽
*
*@paramcontext
*@return
*/
publicstaticintgetScreenWidth(Contextcontext){
WindowManagerwm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetricsdm=newDisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
returndm.widthPixels;
}
/**
*获取屏幕的高度
*
*@paramcontext
*@return
*/
publicstaticintgetScreenHeight(Contextcontext){
WindowManagerwm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetricsdm=newDisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
returndm.heightPixels;
}
二、底部有虚拟按键
华为手机底部都会有一个黑色的虚拟按键(NavigationBar),通过上面这个方式得到的屏幕高度是屏幕真是高度-虚拟按键的高度。所以有虚拟按键的情况获取屏幕的高度就是另一种方法了。
publicstaticintgetRealHeight(Contextcontext){
WindowManagerwm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Displaydisplay=wm.getDefaultDisplay();
intscreenHeight=0;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN_MR1){
DisplayMetricsdm=newDisplayMetrics();
display.getRealMetrics(dm);
screenHeight=dm.heightPixels;
//或者也可以使用getRealSize方法
//Pointsize=newPoint();
//display.getRealSize(size);
//screenHeight=size.y;
}elseif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH){
try{
screenHeight=(Integer)Display.class.getMethod("getRawHeight").invoke(display);
}catch(Exceptione){
DisplayMetricsdm=newDisplayMetrics();
display.getMetrics(dm);
screenHeight=dm.heightPixels;
}
}
returnscreenHeight;
}
虚拟按键高度
虚拟按键(NavigationBar)高度可以通过读取定义在Android系统尺寸资源中的navigation_bar_height获得。
所以不管虚拟按键是显示还是隐藏,得到的结果都是一样的。
publicstaticintgetNavigationBarHeight(Contextcontext){
intnavigationBarHeight=-1;
Resourcesresources=context.getResources();
intresourceId=resources.getIdentifier("navigation_bar_height","dimen","android");
if(resourceId>0){
navigationBarHeight=resources.getDimensionPixelSize(resourceId);
}
returnnavigationBarHeight;
}
状态栏高度
状态栏就是屏幕顶部显示时间,电池,wifi等信息的栏目。
方法一:系统提供了一个Resource类,通过这个类可以获取资源文件,借此可以获取到status_bar_height。
publicintgetStatusBarHeight(){
intresult=0;
intresourceId=getResources().getIdentifier("status_bar_height","dimen","android");
if(resourceId>0){
result=getResources().getDimensionPixelSize(resourceId);
}
returnresult;
}
方法2:通过放射
Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,然后找status_bar_height。
publicvoidgetStatusBarHeightByReflect(){
intstatusBarHeight2=-1;
try{
Class>clazz=Class.forName("com.android.internal.R$dimen");
Objectobject=clazz.newInstance();
intheight=Integer.parseInt(clazz.getField("status_bar_height")
.get(object).toString());
statusBarHeight2=getResources().getDimensionPixelSize(height);
}catch(Exceptione){
e.printStackTrace();
}
Log.e(TAG,"状态栏高度-反射方式:"+statusBarHeight2);
}
借助应用区top属性。
状态栏位于屏幕的最顶端,坐标从(0,0)开始,所以应用区的顶部的位置就是状态栏的高度。
/**
*应用区的顶端位置即状态栏的高度
**注意*该方法不能在初始化的时候用
**/
publicvoidgetStatusBarHeightByTop(){
Rectrectangle=newRect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
Log.e(TAG,"状态栏高度-应用区顶部:"+rectangle.top);
}
应用区域高度
除去状态栏剩下的都时应用区。由此可知屏幕的高度-状态栏高度=应用区的高度。
/**
*不能在onCreate方法中使用。
*因为这种方法依赖于WMS(窗口管理服务的回调)。正是因为窗口回调机制,所以在Activity初始化时执行此方法得到的高度是0。
*这个方法推荐在回调方法onWindowFocusChanged()中执行,才能得到预期结果。
*/
publicvoidgetAppViewHeight(){
//屏幕
DisplayMetricsdm=newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
//应用区域
RectoutRect1=newRect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
intstatusBar=dm.heightPixels-outRect1.height();//状态栏高度=屏幕高度-应用区域高度
Log.e(TAG,"应用区高度:"+statusBar);
}
setContentView高度,view显示的高度
需要在见面创建后才能获取到。
publicstaticintgetContentViewHeight(Activityactivity){
Rectrectangle=newRect();
activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rectangle);
returnrectangle.height();
}
标题栏高度
标题栏高度=应用区高度-view显示高度
publicstaticvoidgetTitleBarHeight(Activityactivity){
RectoutRect1=newRect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);
intviewTop=activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();//要用这种方法
inttitleBarH=viewTop-outRect1.top;
Log.e(TAG,"标题栏高度-计算:"+titleBarH);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。