Android屏幕窗口各部分超详细介绍

简介: 目前,android屏幕上大致分成三个部分:通知栏,内容区、虚拟导航栏(NavigatorBar) 因为这三个区域引起的问题数不胜数,必须好好总结一下

前言


目前,android屏幕上大致分成三个部分:通知栏,内容区、虚拟导航栏(NavigatorBar) 因为这三个区域引起的问题数不胜数,必须好好总结一下

一般情况下,三个区域都显示。如果应用设置了全屏,比如:


requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
复制代码


当然也可以直接设置application的样式为全屏。这时候通知栏隐藏,内容区向上扩展。

如果在系统设置中开启的虚拟手势,虚拟导航栏就隐藏了。这时候内容区就向下扩展。如果同时满足这两个条件,内容区域就实现了真正意义上的全屏。


rootView和contentView


我们知道activity的view树最顶层是rootView,它是一个DocerView,可以通过view.getRootView()getWindow().getDecorView()获取。

那么它的区域是多少?


一般我们理解它的区域就是内容区域,但是这是错误的。它的区域是内容区+虚拟导航栏。

这里就需要区别一下contentViewcontentView是指android.R.id.content对应的view,通过findViewById(android.R.id.content)获取。这个才是真正的内容区。


所以rootView = contentView + NavigatorBar

所以当全屏隐藏通知栏时,rootView就是屏幕大小。当NavigatorBar隐藏时,contentView等于rootView的大小。


通知栏高度


我们经常会想用到通知栏高度,但是android并没有提供这个api,那么怎么办?

想想我们需要用到这一高度的时候一定是通知栏显示的时候,这时候rootView.top就是通知栏高度。

这样就很容易获取到通知栏高度


heightPixels


注意:横屏则是widthPixels

因为竖屏是虚拟导航栏在下面,所以会影响到heightPixels的取值。Android中有几个heightPixels,他们有什么关系


先来看看有哪几种方式获取heightPixels

1、


getResources().getDisplayMetrics().heightPixels
复制代码


2、


var windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
var metrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(metrics)
var height = metrics.heightPixels
复制代码


3、


var windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
var metrics = DisplayMetrics()
windowManager.defaultDisplay.getRealMetrics(metrics)
var height = metrics.heightPixels
复制代码


首先,第一种和第二种方式获取的是同样的东西,只是不同的方法而已,我们称它为rawHeight第三种获取的明显不同,称为realHeight

那么rawHeightrealHeight有什么区别?


它们两个都是屏幕高度,区别在于是否包含虚拟导航栏。rawHeight不包含NavigatorBar高度,而realHeight则包含。

注意两个都包含通知栏高度,所以它们两与rootView.height都不一样,同样与contentView.height也不一样。


对比


上面提到了很多高度,包括两个屏幕高度(rawHeight,realHeight),两个窗口高度(rootView.height,contentView.height)和两个边栏高度(通知栏和虚拟导航栏)

其中知道了rawHeightrealHeight,虚拟导航栏高度就可以很容易得到,即realHeight - rawHeight


那么这些高度存在怎样的关系?

首先上面知道rootView = contentView + NavigatorBar,但是如果NavigatorBar隐藏,rootView和contentView就一样高。


但是rawHeight,realHeight不同,即使NavigatorBar隐藏,rawHeight也等于realHeight-NavigatorBar

当NavigatorBar隐藏时,realHeight = rootView + 通知栏,这种情况再全屏时,realHeight和rootView就相等了(也等于contentView)


而当NavigatorBar显示的时候,rawHeight = rootView + 通知栏, realHeight = rootView + 通知栏 + NavigatorBar

目前官方没有判断虚拟导航栏显示隐藏的api,网上的都不是完全之法。其实可以通过比较rootView和contentView的bottom来判断。


显示区域(键盘高度)


还有一种区域,就是实际显示区域,可以通过


var rect = Rect()
view.getWindowVisibleDisplayFrame(rect)
复制代码


获得,这个就是真正显示的区域,比如键盘弹出时,通过rootView获取的这个rect的高度与实际高度不一致,这样就可以判断出键盘的显示和隐藏。

但是如果想得到键盘高度,用rootView不行,因为它包含虚拟导航栏,如果用实际高度-显示高度,在虚拟键盘隐藏时得到的高度要大与键盘高度。

这时候使用contentView获取即可,因为它不包含虚拟导航栏。


目录
相关文章
|
7月前
|
JavaScript Android开发
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
247 0
|
7月前
|
XML Java Android开发
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
207 0
|
编解码 开发工具 Android开发
Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
好多开发者在做Android平台录像或者RTSP轻量级服务、RTMP推送相关模块时,对需要设计哪些常用接口会心存疑惑,本文主要以大牛直播SDK(官方)为例,简单介绍下Android平台直播推送SDK所有音频相关的接口,感兴趣的开发者可以看看。
|
4月前
|
Android开发
Android Stadio Build 窗口字符串乱码问题
在使用Android Studio过程中,如果遇到Build窗口字符串乱码问题,可以通过编辑`studio.vmoptions`文件添加`-Dfile.encoding=UTF-8`配置并重启Android Studio来解决。
183 1
Android Stadio Build 窗口字符串乱码问题
|
7月前
|
开发工具 Android开发
rk平台Android12屏幕永不休眠
rk平台Android12屏幕永不休眠
113 1
|
3月前
|
API Android开发 数据安全/隐私保护
Android经典实战之窗口和WindowManager
本文介绍了Android开发中“窗口”的基本概念及其重要性。窗口是承载用户界面的基础单位,而`WindowManager`系统服务则负责窗口的创建、更新和移除等操作。了解这些概念有助于开发复杂且用户体验良好的应用。
66 2
|
3月前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
6月前
|
Android开发 开发者
Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。
【6月更文挑战第26天】Android UI设计中,Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等,定义在`styles.xml`。要更改主题,首先在该文件中创建新主题,如`MyAppTheme`,覆盖所需属性。然后,在`AndroidManifest.xml`中应用主题至应用或特定Activity。运行时切换主题可通过重新设置并重启Activity实现,或使用`setTheme`和`recreate()`方法。这允许开发者定制界面并与品牌指南匹配,或提供多主题选项。
89 6
|
6月前
|
Android开发 开发者
Android UI中的Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等。要更改主题
【6月更文挑战第25天】Android UI中的Theme定义了Activity的视觉风格,包括颜色、字体、窗口样式等。要更改主题,首先在`styles.xml`中定义新主题,如`MyAppTheme`,然后在`AndroidManifest.xml`中设置`android:theme`。可应用于全局或特定Activity。运行时切换主题需重置Activity,如通过`setTheme()`和`recreate()`方法。这允许开发者定制界面以匹配品牌或用户偏好。
60 2
|
7月前
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
366 5