AndroidDecorView一窥全貌(下)前言上篇分析了DecorView创建过程,大致说了其子View构成,

上篇分析了DecorView创建过程,大致说了其子View构成,还剩下一些疑点,本篇继续分析。

1、DecorView各个子View具体布局内容2、状态栏(背景)和导航栏(背景)如何添加到DecorView里3、DecorView子View位置与大小的确定4、常见的获取DecorView各个区块大小的方法

照旧,打开Tools->LayoutInspector

先来看看LinearLayout,之前分析过加载DecorView时,根据不同的feature确定不同的布局,我们的demo加载的是默认布局:R.layout.screen_simple。这是系统自带的布局文件,在哪找呢?

切换到Project模式——>找到ExternalLibraries——>对应的编译API——>reslibraryroot——>layout文件夹下——>寻找对应的布局名

R.layout.screen_simple布局内容

再来看看实际的layout展示:

正好和LinearLayout对应,ViewStub也对得上,但是明明布局文件里的FrameLayout是没有子View的,实际怎么会有呢?当然是中途动态添加进去的。

之前分析过,DecorView创建成功后,又继续加载了一个布局:R.layout.abc_screen_toolbar,并赋予subDecor变量,最后将subDecor里的某个子View添加到DecorView里。那么该布局文件在哪找呢?按照上面的方法,你会发现layout里并没有对应的布局文件。

实际上加载R.layout.abc_screen_toolbar是由AppCompatDelegateImpl.java完成的,而该类属于androidx.appcompat.app包,因此该寻找androidx里资源文件

ActionBarOverlayLayout还有个子View

此时DecorView和subDecor已经结合了,并且android.R.id.content也存在,我们在setContentView(xx)里设置的layout会被添加到android.R.id.content里。

前面只是分析了LinearLayout及其子View的构造,而DecorView还有另外两个子View:状态栏(背景)/导航栏(背景)没有提及,接下来看看它们是如何关联上的。既然是DecorView的子View,那么必然有个addView()的过程,搜索后确定如下方法:

DecorView.javaprivatevoidupdateColorViewInt(finalColorViewStatestate,intsysUiVis,intcolor,intdividerColor,intsize,booleanverticalBar,booleanseascape,intsideMargin,booleananimate,booleanforce){Viewview=state.view;//确定View的宽高intresolvedHeight=verticalBarLayoutParams.MATCH_PARENT:size;intresolvedWidth=verticalBarsize:LayoutParams.MATCH_PARENT;//确定View的GravityintresolvedGravity=verticalBar(seascapestate.attributes.seascapeGravity:state.attributes.horizontalGravity):state.attributes.verticalGravity;if(view==null){if(showView){//构造Viewstate.view=view=newView(mContext);//设置View背景色setColor(view,color,dividerColor,verticalBar,seascape);//设置idview.setId(state.attributes.id);LayoutParamslp=newLayoutParams(resolvedWidth,resolvedHeight,resolvedGravity);//添加到DecorViewaddView(view,lp);}}else{//省略...}//省略}该方法根据条件添加子View到DecorView,调用该方法的地方有两处:

再用图表示状态栏、导航栏添加流程:

状态栏/导航栏如何确定位置呢?

publicstaticfinalColorViewAttributesSTATUS_BAR_COLOR_VIEW_ATTRIBUTES=newColorViewAttributes(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);publicstaticfinalColorViewAttributesNAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES=newColorViewAttributes(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/*hideWindowFlag*/);预先设置属性,在updateColorViewInt(xx)设置View的Gravity。导航栏:Gravity.BOTTOM状态栏:Gravity.TOP这样,导航栏和状态栏在DecorView里的位置确定了。

DecorView三个直接子View添加流程已经确定,通过LayoutInspector看看其大小与位置:

从上图两个标红的矩形框分析:LinearLayout上边界是顶到屏幕,而下边界的与导航栏的顶部平齐,而状态栏是盖在LinearLayout上的,这也就是为什么我们可以设置沉浸式状态栏的原因。ContentFrameLayout包含了内容区域,ContentFrameLayout上边界与标题栏底部对齐,下边界充满父控件。来看看代码里如何确定LinearLayout和FrameLayout位置:

ContentFrameLayout父控件是ActionBarOverlayLayout,因此它的位置受父控件控制,ActionBarOverlayLayout计算标题栏占的位置,而后设置ContentFrameLayoutmarginTop属性。

针对上面的布局,对应的用图说话:

既然知道了DecorView各个子View的布局,当然就有相应的方法获取其大小。

只要能获取到DecorView对象,一切都不在话下。常见的通过Activity或者View获取:Activity:

THE END
1.苹果ui设计尺寸是多少?网友(匿名用户)职场问答苹果ui设计尺寸分为界面设计、图标设计、设置界面的图标高度和开关滑动按钮的高度、可点击高度、搜索栏高度、界面元素之间的距离等尺寸规范。具体如下: 1、界面尺寸规范:①界面尺寸大小是:750x1334px;②状态栏(status bar):就是电量条,其高度为:40px; ③导航栏(navigation):就是顶部条,其高度为:88px; ④主菜单...https://zq-mobile.zhaopin.com/zpdOutputQuestionForXZH/5502458
2.CC设计尺寸规范网iPad的设计尺寸 设备尺寸分辨率状态栏高度导航栏高度标签栏高度 iPad 3/4/5/6/Air/Air2/mini2 2048×1536 px264PPI40px88px98px iPad 1/2 1024×768 px132PPI20px44px49px iPad Mini 1024×768 px163PPI20px44px49px iPad图标尺寸 设备App Store程序应用主屏幕Spotlight搜索标签栏工具栏和导航栏 ...http://cc.uiuehome.com/
1.常见的App设计尺寸有哪些?附高效设计工具手机app设计尺寸在移动应用开发蓬勃发展的今天,App 设计的重要性不言而喻。而了解常见的 App 设计尺寸是打造一款优质 App 的基础,合适的设计尺寸能够确保 App 在不同设备上都能呈现出完美的视觉效果和良好的用户体验。本文将详细介绍常见的 App 设计尺寸,并推荐高效设计工具。 https://blog.csdn.net/haishao520/article/details/143733993
2.android导航栏尺寸安卓的导航栏多高1.隐藏小程序自带的导航栏 2.编写自定义导航栏 3.如何使用 最近使用wx.getMenuButtonBoundingClientRect(),在ios端偶尔值全都是0,导致无法正确自定义导航栏高度 步骤 1.隐藏小程序自带的导航栏 小程序配置 // 1.全局配置 // app.json { ... "navigationStyle": "custom" ...https://blog.51cto.com/u_16213611/11598749
3.网页设计的导航栏尺寸(网页设计导航栏间距怎么设置)当前最流行的分辨率是1920*1080,在该分辨率下,页面中心区域为1200px以内都可以在800*600分辨率下,导航栏尺寸规格保持在778px以内在1024*768分辨率下,网页宽度保持在1002px以内如果没有指定的要求,以1920尺寸设计就好。 目前ios的尺寸都是_@2x,除了plus需要注意导航栏60PX,底部标签栏148PX,尺寸需要_@3X也就是15倍计...https://www.yuanmacun.com/post/116821.html
4.iphonexs导航栏大小?6条回答:【推荐答案】一、界面尺寸规范1、界面尺寸大小为:750x1334px。2、状态栏(statusbar):高度为40px;3、导航栏(navigation):高度为88px;4、主菜单栏(submenu,tab):高度为98px;5、内容区域(cohttps://wap.zol.com.cn/ask/x_18806634.html
5.手机APP原型设计尺寸规范大全接下来就跟着我们的脚步一起来看看关于手机 APP 原型设计尺寸规范大全的详细内容吧,主要有 6 个方面,分别是:界面尺寸、导航栏、标签栏、图标尺寸及布局、文字、其他交互元素原型设计尺寸,一起来看!https://js.design/special/article/mobile-app-prototyping-size.html
6.App原型设计规范appios安卓间距9.文字颜色(安全色) 打开网易新闻 查看精彩图片 10.导航栏下的提示栏 ①颜色建议要鲜艳 ②大小:28px 以上为app端绘制原型时,涉及到的一些规范及尺寸,希望能够帮助到大家,如有任何疑问或者建议,可在评论区交流https://m.163.com/dy/article/HQLFVGD90553ECNE.html
7.app导航栏都有哪些分类?一篇文章为你解析~~导航栏是手机app界面中十分常见的,用于指引用户进一步操作的方式,app导航栏通过把所有功能整合贯穿在一起,让用户能够顺利地在产品中畅行。 虽然我们的手机里下载了几十种app,但真要说道起关于app导航栏的种类可能又无从下口,这篇文章就带你全方位了解app导航栏的种类~~ 01 标签式 标签式导航是比较常见的一类导航...https://www.canva.cn/learn/app-navigation-bar/
8.iPhone/iPad/AndroidUI尺寸规范iPhone图标尺寸: 设备App Store程序应用主屏幕Spotlight搜索标签栏工具栏和导航栏 iPhone7,8(@2×) 1024×1024 px180×180 px114×114 px87×87 px75×75 px66×66 px iPhone6 Plus(@3×) 1024×1024 px180×180 px114×114 px87×87 px75×75 px66×66 px ...https://www.bejson.com/ui/phonesize/
9.如何设计出体验更好的UI底部导航栏?优设网导航栏尺寸 虽然图标的形状会因为设计的差异而有所不同,但是在图标外观的现实格式和基础尺寸上,应该保持一致。 激活状态下的图标尺寸可能会有所增加,配色和轮廓会微调,以达到抓人眼球的目的,但是不应差异太大。 在具体的设计上,底部导航栏形成了如今的一套最佳实践。 https://www.uisdc.com/better-bottom-navbar
10.OPPO开放平台解决方案:因为各机型的尺寸不同,会和顶部导航栏重叠冲突,从而在个别机型出现断层问题,建议改为和导航栏蓝色相同的带顶部渐变色的背景图,这样可以规避这个问题,实现无缝衔接 虚拟按键不一致 解决方案:虚拟按键美化需保持上方选择展示虚拟按键区域与实际应用效果保持一致。 https://open.oppomobile.com/new/developmentDoc/info?id=11929
11.uniapp底部导航栏的图片大小无法设置怎么办?如果你不知道如何实现底部导航栏,可以参考文档https://blog.csdn.net/weixin_50606255/article/details/116270949 问题描述:当app运行到浏览器时,可以修改底部导航栏的图标样式来控制图标大小,但是再运行到真机时却发现底部导航栏根本没有改变 关于底部导航栏的图标,官方只有以下说明: 只是在图标尺寸上做出了建议,并没有...https://www.pianshen.com/article/78352816410/
12.五业务菜单·微课堂后台操作教程·看云https://apps.wexiaocheng.com/app/index.php?i=138&c=entry&do=qrcode&m=fy_lessonv2 导航栏位置:选择导航栏显示的位置 导航名称:导航名称 未选状态图标:建议图标长宽尺寸100*100px,点击下载默认图标,更多精美图标请访问阿里巴巴矢量图标库 已选状态图标:已选状态图标尺寸和未选状态图标尺寸必须一致 ...https://www.kancloud.cn/weixiaocheng/weiketang/1126067
13.入门收藏篇!AndroidUI界面设计尺寸大全应用栏 App Bar通常由一个标题和一些图标组成,分解来看: 18 是Material Design 设计的默认标题文本大小 底部导航栏 底部导航栏通常有 2-5 个选项卡,但最好不要超过不要使用超过 5 个标签。作为 UI 设计师,你需要清楚每个图标的含义,但作为与用户交互的界面,你还需要保证用户清楚每个图标的含义,所以最好设置带有...https://pixso.cn/designskills/android-ui-design-dimensions/
14.app界面设计尺寸规范大全☆ 顶部导航栏的图标尺寸为16x16px左右,底部标签栏的图标尺寸为23 x 23px左右。 4、关于iPhone6的文字的尺寸: ☆ 导航栏的文字大小最大值是14px,底部标签栏的图标下方的文字大小为10px。 ☆ 内容区域的文字大小是:10px, 12px,14px,16px。 5、关于颜色 ...https://www.jianshu.com/p/0e28bf6c7e9c
15.超简单的几行代码搞定Android底部导航栏功能Android超简单,几行代码搞定Android底部导航栏—–应项目需求以及小伙伴的留言,新加了两个方法:设置底部导航栏背景图片 添加底部导航栏选项卡切换监听事件底部导航栏的实现也不难,就是下边是几个Tab切换,上边一般是一个FrameLayout,然后FrameLayout中切换fragment。网上有不少关于Android底部导航栏的文章,不过好像都只是关于下边...https://www.jb51.net/article/135944.htm
16.关于Android全面屏虚拟导航栏的适配总结Android系统发布十多年以来,关于Android的UI的适配一直是开发环节中最重要的问题,但是我看到还是有很多小伙伴对Android适配方案不了解。刚好,近期准备对糗事百科Android客户端设计一套UI尺寸适配方案,可以和小伙伴们详细的聊一聊这个问题。 Android适配最核心的问题有两个,其一,就是适配的效率,即把设计图转化为App界面的...https://developer.aliyun.com/article/687885
17.移动应用界面设计的尺寸规范「建议收藏」腾讯云开发者社区iPhone的APP界面一般由四个元素组成,分别是:状态栏、导航栏、主菜单栏以及中间的内容区域。 这里取用 640×960 的尺寸设计,那我们就说说在这个尺寸下这些元素的尺寸: 状态栏:就是我们经常说的信号、运营商、电量等显示手机状态的区域,其高度为:40 px 导航栏:显示当前界面的名称,包含相应的功能或者页面间跳转的按...https://cloud.tencent.com/developer/article/2030078
18.UI设计规范尺寸移动端ui设计规范和标准设备尺寸分辨率状态栏高度导航栏高度标签栏高度 iPad 3 - 4 - 5 - 6 - Air - Air2 - mini2 2048×1536 px264PPI40px88px98px iPad 1 - 2 1024×768 px132PPI20px44px49px iPad Mini 1024×768 px163PPI20px44px49px iPad图标尺寸 设备App Store程序应用主屏幕Spotlight搜索标签栏工具栏和导航栏 ...http://www.06ps.com/tool/ui.html