android 获取状态栏高度

  1. 需求描述
    有时候计算view位置的时候需要得到状态栏的高度,然后减去这个高度,现在给大家总结两种获取状态栏高度的方法。
  2. 代码实现
    方法一:
    通过反射拿到R文件的dimen对象,然后直接拿到status_bar_height属性的值,也就是状态栏的高度
    注意:这个方法是直接拿到系统的属性,不是通过计算,所以写在任何周期都OK
public static int getStatusHeight(Context context) {
        int statusHeight = -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());
            statusHeight = context.getResources().getDimensionPixelSize(height);
            Log.i("TAG", "statusHeight:" + statusHeight);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusHeight;
    }

方法二:
拿到Window对象,然后测量出状态栏的高
注意:这种方法要等window启动才能测量,不然拿到的数值就是0,所以要等window完全启动才能调用

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        Rect frame = new Rect();
        this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;
        Log.i("TAG", "statusBarHeight:" + statusBarHeight);
        super.onWindowFocusChanged(hasFocus);
    }

最后给大家分析下屏幕结构
这里写图片描述
屏幕区域大小的获取方法是,

Display defaultDisplay = this.getWindowManager().getDefaultDisplay();
        int width = defaultDisplay.getWidth();// 屏幕的宽
        int height = defaultDisplay.getHeight();// 屏幕的高

        Point outP = new Point();
        defaultDisplay.getSize(outP);
        int width2 = outP.x;// 屏幕的宽
        int height2 = outP.y;// 屏幕的高

应用区域的大小获取方法是

Rect frame = new Rect();
        this.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        //应用区域离顶部距离,也就是状态栏的高
        int statusBarHeight = frame.top;//同理也有left,right等
        frame.width();//应用区域的宽
        frame.height();//应用区域的高
        Log.i("TAG", "statusBarHeight:" + statusBarHeight);

view绘制区域的大小获取方法

Rect outRect = new Rect();
        this.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);
        int width3 = outRect.width();// view绘制区域的宽
        int height3 = outRect.height();//view绘制区域的高

推理:状态栏的高为:屏幕区域的高减去应用区域的高,标题栏的高为:应用区域的高减去view绘制区域的高

注意:很多时候我们设置style为NOTITLEBAR,那么view绘制区域和应用区域重合,如果设置全屏,那么三个区域都重合。

建议用方法一,更方便快捷

/**
* --------------
* 欢迎转载 | 转载请注明
* --------------
* 如果对你有帮助,请点击|顶|
* --------------
* 请保持谦逊 | 你会走的更远
* --------------
* @author css
* @github https://github.com/songsongbrother
* @blog http://blog.csdn.net/xiangxi101
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值