Connor学Android - RootView、DecorView、MeasureSpec
Learn && Live
虚度年华浮萍于世,勤学善思至死不渝
前言
Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习、复盘过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/pIpx0,话不多说我们马上开始!
1.ViewRoot
ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联
root = new ViewRootImpl(view.getContext(), display);
root.setView(view, wparams, panelParentView);
2.DecorView
DecorView作为顶级View,继承了FrameLayout,一般情况下它内部会包含一个竖直方向的LinearLayout,在这个LinearLayout中分为上下两部分,上面是标题栏,下面是内容栏(id是content)。View层的事件都先经过DecorView,然后才传递给我们的View
3.MeasureSpec
MeasureSpec代表一个32位int值,高2位代表SpecMode,指测量模式;低30位代表SpecSize,指某种测量模式下的规格大小
打包和解包
MeasureSpec通过将SpecMode和SpecSize打包成一个int值来避免过多的对象内存分配,为了方便操作,提供了打包和解包方法
即一组SpecMode和SpecSize可以打包为一个MeasureSpec,一个MeasureSpec可以解包得到原始的SpecMode和SpecSize
注意这里的MeasureSpec指MeasureSpec所代表的int值,而非MeasureSpec本身
SpecMode
UNSPECIFIED 父容器不对View有任何限制,要多大给多大,一般用于系统内部,表示一种测量的状态
EXACTLY View的最终大小就是SpecSize所指定的值,对应match_parent和指定具体数值这两种模式
AT_MOST 父容器指定了一个可用大小,即SpecSize,View的大小不能大于这个值,具体是什么由View的具体实现决定。对应wrap_content模式
4.MeasureSpec和LayoutParams的对应关系
在View测量时,系统会将LayoutParams在父容器的约束下转换成对应的MeasureSpec,再根据MeasureSpec来确定View测量后的宽/高
(1)DecorView(顶级View):MeasureSpec由窗口尺寸和自身的LayoutParams共同确定
(2)普通View:MeasureSpec由父容器的MeasureSpec、自身的LayoutParams和View的margin及padding共同确定
MeasureSpec确定后便可在onMeasure中确定View的测量宽/高
DecorView
- LayoutParams.MATCH_PARENT:精确模式,大小就是窗口的大小
- LayoutParams.WRAP_CONTENT:最大模式,大小不定,但不能超过窗口的大小
- 固定大小(比如100dp):精确模式,大小即为LayoutParams指定的大小
普通View
(parentSize指父容器中目前可使用的大小)
注意wrap_content模式下,不管父容器的模式是EXACTLY还是AT_MOST,View的模式总是AT_MOST且大小为parentSize
Connor学Android - RootView、DecorView、MeasureSpec相关推荐
- Connor学Android - JNI和NDK编程
Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...
- Connor学Android - Android动画
Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...
- Connor学Android - Bitmap的加载和缓存策略
Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...
- 从零开始学android编程_android初学者的入门秘籍
大概是去年年底开始接触android 原本是学习嵌入式的我,领导让我看看能不能搞一下这个android APP. 一开始的我懵逼得很... 这android APP 不是得用java写吗??? 现在我 ...
- 做嵌入式的必须学Android吗
做嵌入式的必须学Android吗 Android方向适合哪些人呢?适合那些已经在自己领域有了一定的工作经验的人,适合作为自己的拓展,适合提升自己的能力,譬如说已经做三年Linux驱动,就可以尝试拓展去 ...
- 教我兄弟学Android逆向
作者论坛****账号:会飞的丑小鸭 课程导航: <教我兄弟学Android逆向01 编写第一个Android程序> <教我兄弟学Android逆向02 破解第一个Android程序 ...
- Carson带你学Android:你要的WebView与 JS 交互方式都在这里了
前言 现在很多App里都内置了Web网页(Hybrid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 上述功能是由Android的WebView实现的,其中涉及到Android客户端与 ...
- Carson带你学Android:请收好这一份全面详细的Android学习指南
前言 如果你也学习Android,那么你大概率会看过我的文章.经常有读者给我留言:"该怎么学习Android?"."日常学习Android的方法是什么". 今天 ...
- Carson带你学Android:源码解析自定义View Draw过程
前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化 等 今天,我将全面总结自定义View ...
最新文章
- Redis 为什么是单线程的?
- ​通俗理解神经网络BP反向传播算法
- 信息学奥赛一本通C++语言——1124:矩阵加法
- CSS 与 HTML5 响应式图片
- Java的序列化特性将要退出历史舞台了
- vue修改Element的el-table样式
- CentOS 服务器搭建 mediawiki
- 记录——《C Primer Plus (第五版)》第九章编程练习第一题
- Jquery第二篇【选择器、DOM相关API、事件API】
- bootstrap16-上下文表格布局
- 移动硬盘上安装Windows 10系统
- 博科Brocade 300光纤交换机配置zone教程
- 二项式分布(Binomial Distribution)
- CEST日期格式转换为 年月日时分秒
- 特征可视化技术(CAM)
- 企业为什么需要信息化?
- Python - 深度学习系列13- 显卡与CPU计算对比
- html表单 access,【Access基础】OpenForm打开窗体方法详解
- DOS命令行下输入mount命令
- 用我的沃土编织你的穹顶:华为的欧洲告白