安卓中如何获取状态栏和标题栏的高度

安卓的屏幕显示区域划分

  安卓的屏幕显示区域分为三个嵌套的部分,依次为 屏幕显示区域应用显示区域视图显示区域

  其中,屏幕显示区域 指的是整个屏幕的尺寸。这个尺寸通常是不会变的,且就是手机厂商对外公布的手机屏幕大小数据。它包含状态栏、标题栏和内容区域。

  应用显示区域 指的是应用实际显示的面积。它不包含状态栏,但包含标题栏。而且,这个值是会随应用显示的面积的改变而改变的。比如,当文本框需要输入时,如果弹出了输入法,则 应用显示区域 的高度值会减少输入法的高度。

  视图显示区域指的就是内容区域。它不包含状态栏、标题栏。

  因此,在没有输入法的正常情况下:屏幕显示区域 > 应用显示区域 > 视图显示区域

  因为输入法的高度一般大于状态栏,所以在有输入法的情况下:屏幕显示区域 > 视图显示区域 > 应用显示区域

  下面给出求这几个尺寸的方法。

求屏幕显示区域的大小

方法 1

/**
 * 获取屏幕尺寸(包含标题栏、状态栏)
 *
 * @since 2023-4-11
 */
public static Dimension getScreenSize(Activity activity) {
    var view = activity.getWindow().getDecorView();
    return new Dimension(view.getWidth(), view.getHeight());
}

方法 2

/**
 * 方法 2:获取屏幕尺寸(包含状态栏、标题栏)
 *
 * @since 2023-4-11
 */
public static Dimension getScreenSize2(Activity activity) {
    var disp = activity.getWindowManager().getDefaultDisplay();
    var point = new Point();
    disp.getSize(point);
    return new Dimension(point.x, point.y);
}

求应用显示区域的大小

求输入法键盘的高度

关于这方面的内容,可见笔者的另一篇博客:

安卓中如何获取输入法的高度:
https://blog.csdn.net/wangpaiblog/article/details/130479682

求应用显示区域的大小

/**
 * 获取应用尺寸(包含标题栏,但不包含状态栏)
 *
 * 如果遇到输入法键盘弹出的情况,此方法的返回值会减去输入法键盘的高度
 *
 * @param needConsiderKeyboard 为 true,则认为应用的真实尺寸应减少输入法键盘的高度。
 *                              为 false,则认为真实尺寸为输入法键盘出现之前的高度
 * @param keyboardHeight 输入法键盘的高度。
 *                       此值只有 needConsiderKeyboard 为 true 时才有效。
 *                       如果界面中没有出现输入法键盘,此值为 0
 * @since 2023-4-11
 */
public static Dimension getApplicationSize(
        Activity activity, boolean needConsiderKeyboard, int keyboardHeight) {
    var rect = new Rect();
    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
    if (needConsiderKeyboard) {
        return new Dimension(rect.width(), rect.height());
    } else {
        return new Dimension(rect.width(), rect.height() + keyboardHeight);
    }
}

求视图显示区域的大小

/**
 * 获取视图尺寸(不包含状态栏、标题栏)
 *
 * @since 2023-4-11
 */
public static Dimension getViewSize(Activity activity) {
    var rect = new Rect();
    activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect);
    return new Dimension(rect.width(), rect.height());
}

求状态栏显示区域的大小

/**
 * 获取状态栏尺寸
 *
 * @since 2023-4-11
 */
public static Dimension getStatusBarSize(Activity activity, int keyboardHeight) {
    return Dimension.subtract(
            getScreenSize(activity),
            getApplicationSize(activity, false, keyboardHeight));
}

求标题栏显示区域的大小

/**
 * 获取标题栏尺寸
 *
 * @since 2023-4-11
 */
public static Dimension getTitleBarSize(Activity activity, int keyboardHeight) {
    return Dimension.subtract(
            getApplicationSize(activity, false, keyboardHeight),
            getViewSize(activity));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值