之前在项目里遇到需要定位控件坐标的问题,这里有两个获取坐标的方法:
getLocationInWindow()
得到控件相对窗口左上角的x、y轴坐标。
我理解这个“窗口”应该是不包含状态栏的。
getLocationOnScreen()
得到控件相对屏幕左上角的x、y轴坐标。
我理解这个“屏幕”应该是包含状态栏的。
但是,实际情况这里我log打印得到的结果,两个方法得到的值居然是一样的,都是getLocationOnScreen()的值,相对屏幕的包含状态栏的坐标。这里我用的是真机H60-L03测试。我没有研究这是因为手机还是因为应用,也有可能就是这方法的问题,这个先不考虑。
这个坐标我觉得是要拿到应用展示范围内的坐标,也就是不包含状态栏的。所以这里就要获取到状态栏的高度,然后getLocationOnScreen()拿到的y坐标减去状态栏高度。
有这个思路就baidu找嘛,找到三种方法如下:
1.状态栏高度定义在Android系统尺寸资源中status_bar_height,但这并不是公开可直接使用的,例如像通常使用系统资源那样android.R.dimen.status_bar_height。但是系统给我们提供了一个Resource类,通过这个类我们可以获取资源文件。
- public static int getStatusBarHeight() {
- return Resources.getSystem().getDimensionPixelSize(
- Resources.getSystem().getIdentifier("status_bar_height", "dimen", "android"));
- }
2.这里还有另外一种方法,大家都知道Android的所有资源都会有惟一标识在R类中作为引用。我们也可以通过反射获取R类的实例域,代码如下
- public int getStatusBarHeight(Context context){
- Class<?> c = null;
- Object obj = null;
- Field field = null;
- int x = 0, statusBarHeight = 0;
- 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 e) {
- e.printStackTrace();
- }
- return statusBarHeight;
- }
- public int getStatusBarHeight(){
- Rect rect = new Rect();
- getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
- return rect.top;
- }
这里我用的是第一种,当然,虽然我没尝试过,但这三种方法应该是都可以的。
最后,贴上获取状态栏高度的文章链接:http://www.2cto.com/kf/201501/374049.html