我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Android】获取导航栏、状态栏高度

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Android】获取导航栏、状态栏高度

获取状态栏高度

public static int getStatusBarHeight(Context context) {    int result = 0;    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");    if (resourceId > 0) {        result = context.getResources().getDimensionPixelSize(resourceId);    }    return result;}

或者

getWindow().getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {    int statuBarHeight = insets.getStableInsetTop();    return insets;});

获取导航栏高度

public static int getNavigationBarHeight(Context context) {    int result = 0;    int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");    if (resourceId > 0) {        result = context.getResources().getDimensionPixelSize(resourceId);    }    return result;}

或者

getWindow().getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {    int navigationBarHeight = insets.getStableInsetBottom();    return insets;});

其他数据

系统的各种数据定义位于SDK的xml文件中:

android-30/data/res/values/dimens.xml

<dimen name="toast_y_offset">24dpdimen><dimen name="status_bar_height">@dimen/status_bar_height_portraitdimen><dimen name="status_bar_height_portrait">24dpdimen><dimen name="status_bar_height_landscape">@dimen/status_bar_height_portraitdimen><dimen name="navigation_bar_height">48dpdimen><dimen name="navigation_bar_height_landscape">48dpdimen><dimen name="navigation_bar_width">48dpdimen>

通过key可以获取对应的值。

修改导航栏、状态栏背景色

getWindow().setStatusBarColor(Color.RED);getWindow().setNavigationBarColor(Color.RED);

源码

导航栏和状态栏源码相似

#PhoneWindow@Overridepublic void setStatusBarColor(int color) {    mStatusBarColor = color;    mForcedStatusBarColor = true;    if (mDecor != null) {        mDecor.updateColorViews(null, false );    }}
#DecorViewpublic static final ColorViewAttributes STATUS_BAR_COLOR_VIEW_ATTRIBUTES =        new ColorViewAttributes(SYSTEM_UI_FLAG_FULLSCREEN, FLAG_TRANSLUCENT_STATUS,                Gravity.TOP, Gravity.LEFT, Gravity.RIGHT,                Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME,                com.android.internal.R.id.statusBarBackground,                FLAG_FULLSCREEN, ITYPE_STATUS_BAR);public static final ColorViewAttributes NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES =        new ColorViewAttributes(                SYSTEM_UI_FLAG_HIDE_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION,                Gravity.BOTTOM, Gravity.RIGHT, Gravity.LEFT,                Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME,                com.android.internal.R.id.navigationBarBackground,                0 , ITYPE_NAVIGATION_BAR);private final ColorViewState mStatusColorViewState = new ColorViewState(STATUS_BAR_COLOR_VIEW_ATTRIBUTES);private final ColorViewState mNavigationColorViewState = new ColorViewState(NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES);
WindowInsets updateColorViews(WindowInsets insets, boolean animate) {...    updateColorViewInt(mNavigationColorViewState, sysUiVisibility,             calculateNavigationBarColor(), mWindow.mNavigationBarDividerColor, navBarSize,             navBarToRightEdge || navBarToLeftEdge, navBarToLeftEdge,             0 , animate && !disallowAnimate,             mForceWindowDrawsBarBackgrounds, controller);...    updateColorViewInt(mStatusColorViewState, sysUiVisibility,              calculateStatusBarColor(), 0, mLastTopInset,              false , statusBarNeedsLeftInset, statusBarSideInset,              animate && !disallowAnimate,              mForceWindowDrawsBarBackgrounds, controller);}

调用updateColorViews更新背景色的方法,还有如下位置:
在这里插入图片描述

#ViewRootImplprivate void performTraversals() {dispatchApplyInsets(host);}public void dispatchApplyInsets(View host) {     mApplyInsetsRequested = false;     WindowInsets insets = getWindowInsets(true );     host.dispatchApplyWindowInsets(insets);...}#Viewpublic WindowInsets dispatchApplyWindowInsets(WindowInsets insets) {    ...    return onApplyWindowInsets(insets);...}#DecorView@Overridepublic WindowInsets onApplyWindowInsets(WindowInsets insets) {    ...    insets = updateColorViews(insets, true);    ...    return insets;}

关于WindowInsets

WindowInsets可以翻译为窗口附加物,一般是指一个界面中,不由开发者直接控制的部分,例如:状态栏、底部的导航栏等等。具体的类型在Type中有定义:

#WindowInsets.Typestatic final int FIRST = 1 << 0;static final int STATUS_BARS = FIRST;static final int NAVIGATION_BARS = 1 << 1;static final int CAPTION_BAR = 1 << 2;static final int IME = 1 << 3;static final int SYSTEM_GESTURES = 1 << 4;static final int MANDATORY_SYSTEM_GESTURES = 1 << 5;static final int TAPPABLE_ELEMENT = 1 << 6;static final int DISPLAY_CUTOUT = 1 << 7;static final int LAST = 1 << 8;static final int SIZE = 9;static final int WINDOW_DECOR = LAST;

可以向DecorView添加监听,处理WindowInsets

getWindow().getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {    return insets;});

所以,可以在这里获取导航栏和状态栏的高度:

getWindow().getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {    int statuBarHeight = insets.getStableInsetTop();    int navigationBarHeight = insets.getStableInsetBottom();    return insets;});

也可以修改导航栏和状态栏的高度(好像没有应用场景):

getWindow().getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {    int statuBarHeight = 0;    int navigationBarHeight = 0;    return insets.replaceSystemWindowInsets(0,statuBarHeight,0,navigationBarHeight);;});

来源地址:https://blog.csdn.net/qq_23049111/article/details/126948312

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Android】获取导航栏、状态栏高度

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android WindowInsetsController 设置状态栏、导航栏

WindowInsetsController 窗口控制器 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//android 30val windowInsetsController
2023-08-19

Android怎样获取屏幕、状态栏及标题栏的高度

这篇文章主要介绍了Android怎样获取屏幕、状态栏及标题栏的高度,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在开始之前,先来看一张图:绿色区域:屏幕区域蓝色区域:状态栏区
2023-05-30

Android有效获取状态栏(StatusBar)高度的方法

本文实例讲述了Android有效获取状态栏(StatusBar)高度的方法。分享给大家供大家参考,具体如下: 碰到了需要获取状态栏高度的问题。 就像android后期版本,无法直接退出一样。找了一些方法来获取状态栏高度,结果都是为0. 还好
2022-06-06

Android设置透明状态栏和透明导航栏

Android透明状态栏只有在4.4之后有。 在代码中加入下面几行代码即可实现您可能感兴趣的文章:Android之沉浸式状态栏的实现方法、状态栏透明Android沉浸式状态栏实现示例Android UI体验之全屏沉浸式透明状态栏样式Andr
2022-06-06

Android 取得状态栏、任务栏高度的小例子

代码如下:package com.aslibra.test; import android.app.Activity; import android.graphics.Rect; import android.os.Bundle; imp
2022-06-06

Android 获取屏幕高度,标题高度,状态栏高度(实例代码)

通过View提供的方法获取高度方式有两种: 1, 当前显示的view中直接获取当前view高宽2, 通过Activity的getWindow().findViewById(Window.ID_ANDROID_CONTENT)获取系统当前显示
2022-06-06

Android中获取状态栏高度的两种方法分享

前言 最近在做一个关于FAB的功能的时候需要获取状态栏的高度,在网上查了很多种方法,下面是选出的比较合理的两个方法。主要参考stackoverflow的这篇问答:http://stackoverflow.com/questions/3407
2022-06-06

Android项目中如何实现获取状态栏的高度

这篇文章将为大家详细讲解有关Android项目中如何实现获取状态栏的高度,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。方法一:private double getStatusBarHeigh
2023-05-31

iOS状态栏、导航栏的一些笔记分享

前言 IOS的界面分为状态栏和导航栏,如下图所示:状态栏与导航栏的位置如上图,我们可以通过[UIApplication sharedApplication].statusBarFrame.size获取状态栏的size(一般没有刘海时的高度为
2022-05-27

uniapp获取底部安全距离以及状态栏高度等

最近在用uniapp开发的时候遇到了一些问题,下面这篇文章主要给大家介绍了关于uniapp获取底部安全距离以及状态栏高度等的相关资料,需要的朋友可以参考下
2022-11-13

Android编程实现获取标题栏、状态栏的高度、屏幕大小及模拟Home键的方法

本文实例讲述了Android编程实现获取标题栏、状态栏的高度、屏幕大小及模拟Home键的方法。分享给大家供大家参考,具体如下: 1. 获取标题栏高度:/** * 获取标题栏的高度 * * @param activity * @ret
2022-06-06

史上最完美的Android沉浸式状态导航栏攻略

前言 最近我在小破站开发一款新App,叫高能链。我是一个完美主义者,所以不管对架构还是UI,我都是比较抠细节的,在状态栏和导航栏沉浸式这一块,我还是踩了挺多坑,费了挺多精力的。这次我将我踩坑,适配各机型总结出来的史上最完美的Android沉
2023-08-17

Android获取手机屏幕宽高、状态栏高度以及字符串宽高信息的方法

本文实例讲述了Android获取手机屏幕宽高、状态栏高度以及字符串宽高信息的方法。分享给大家供大家参考。具体如下: 首先定义TextView对象commentText 获取文字的宽高:TextPaint textPaint = new Te
2022-06-06

Android编程获取通知栏高度的方法

本文实例讲述了Android编程获取通知栏高度的方法。分享给大家供大家参考,具体如下: 这里通过反射机制获取通知栏高度 通知栏高度写在dimen文件中:public static int getStatusBarHeight(Context
2022-06-06

Android 高仿QQ 沉浸式状态栏

前言: 在进入今天正题前,还是老样子先谈谈感想吧,最近感觉整个都失去了方向感,好迷茫!找工作又失败了,难道Android真的饱和了?这两天我一直没出门,除了下楼哪外卖就是宅宿舍了,静想了许久,我还是不能忘了初心,我相信我找不到工作的原因有很
2022-06-06

vue不同身份获取导航栏不一样

Vue 是一种流行的前端框架,用于构建单页面应用程序,具有完美的数据绑定功能和易于学习的语法。在实际开发中,经常需要根据用户身份加载不同的导航栏。本文将介绍如何在 Vue 中实现根据不同身份获取不同导航栏的功能。## 前置条件本文假设您已经熟悉 Vue.js 基础知识和 webpack 打包工具。 如果您对这些内容不太了解,建议先学习相关课程。## 确认需求在开始编写代码之前,
2023-05-24

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录