在Android上,目前我知道的获取屏幕尺寸的方法有三种不一样的代码形式html
方法1.在Activity中最多见的调用方式java
WindowManager windowManager = getWindowManager();android
Display display = windowManager.getDefaultDisplay();函数
int screenWidth = display.getWidth();测试
int screenHeight = display.getHeight();线程
因为在API Level 13之后上述的getWidth和getHeight包括getOrientation都变成了@Deprecated,因此屏幕宽高用getSize替换,也就有了方法2htm
Point outSize = new Point();blog
display.getSize(outSize);资源
screenWidth = outSize.x;get
screenHeight = outSize.y;
显然要作API Level的区分感受会不太舒服,那么就有了第三种通用形式
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth =dm.widthPixels;
screenHeight =dm.heightPixels;
其实上述三种代码形式,调用的都是WindowManager的default Display object里面的宽高尺寸,有些地方说上述这三种形式在屏幕未显示时是拿不到具体值的,会拿到全是0的状况,我在Activity的onCreate函数中进行对其调用发现是能取到具体数值的,并且即便不在Activity中,经过Application的onCreate函数中的以下代码:
((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm);
也能顺利拿到具体的屏幕宽高值。
因为decorView是window中的最顶层view,能够从window中获取到decorView,而后decorView有个getWindowVisibleDisplayFrame方法能够获取到程序显示的区域,包括标题栏,但不包括状态栏。
因而就有了算出状态栏高度的第一种代码形式
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
上述代码有时候获取到的高度是0,网上说法是在4.0.3版本之后的都会返回0,我没有亲测,可是在个人真机上确实拿到是0,网上流出一种在源码程序中获取状态栏高度的代码:
statusBarHeight = getResources().getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
那么在非源码中应该怎么获取呢?网上流行的一种解决方案,就是对上述须要源码的实现方式经过反射来实现状态栏高度的获取,具体代码以下:
import java.lang.reflect.Field;
//获取手机状态栏高度
public static int getStatusBarHeight(Context context){
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0, statusBarHeight = 38;//一般这个值会是38
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
}
return statusBarHeight;
}
通过测试发现这个函数在状态栏隐藏的时候得到的值和状态栏显示时的值是同样的,不会变化,并且在作横竖屏测试时,也是同样不会改变,即状态栏的高度在手机上应该是固定的。
上面方法是参考了网上有个获取状态栏高度的帖子而来的
http://www.cnblogs.com/renkangke/archive/2013/05/27/3101375.html
上面讲了获取状态栏,顺带就引出如何获取标题栏高度的问题,目前我所知道的获取标题栏高度的方法是不能在onCreate函数中直接使用,必须在UI显示出来后调用,具体大概是layout以后进行调用吧,具体代码以下:
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
//statusBarHeight是上面所求的状态栏的高度
int titleBarHeight = contentTop – statusBarHeight;
上述方法的原理就是getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view是程序不包括标题栏的部分。因为不能直接在onCreate函数中调用,因此有些调用方法是在onCreate中起一个线程,而后延时调用。
我也不知道有什么方法能够更加靠谱的获取标题栏高度,若是有哪位技术牛人知道还望告知,另外这种方法与ContentView中的其它控件的尺寸获取同样,在onCreate中是没法直接获取的,直接获取都会是0。
另外在代码中咱们使用的是具体的像素值,具体像素值是与设备相关的,咱们通常不在代码中直接使用具体使用像素值,而是在资源文件中定义好设备无关的dp数值,而后经过相似以下方法获取具体的像素值int padding = getResources().getDimensionPixelSize(R.dimen.broadcast_select_padding);有时候也有一种具体数值的方法来获取像素值,好比上述的R.dimen.broadcast_select_padding假如是16dp,则能够经过下述方法获取像素值DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int padding = 16 * dm.scaledDensity可是这种方法我并不建议使用,由于Android的设备品类太多,在有些手机上这种乘法得到的值与getResources().getDimensionPixelSize得到的值并不相等,然后者确定比前者准确。