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自身的LayoutParamsView的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相关推荐

  1. Connor学Android - JNI和NDK编程

    Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...

  2. Connor学Android - Android动画

    Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...

  3. Connor学Android - Bitmap的加载和缓存策略

    Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...

  4. 从零开始学android编程_android初学者的入门秘籍

    大概是去年年底开始接触android 原本是学习嵌入式的我,领导让我看看能不能搞一下这个android APP. 一开始的我懵逼得很... 这android APP 不是得用java写吗??? 现在我 ...

  5. 做嵌入式的必须学Android吗

    做嵌入式的必须学Android吗 Android方向适合哪些人呢?适合那些已经在自己领域有了一定的工作经验的人,适合作为自己的拓展,适合提升自己的能力,譬如说已经做三年Linux驱动,就可以尝试拓展去 ...

  6. 教我兄弟学Android逆向

    作者论坛****账号:会飞的丑小鸭 课程导航: <教我兄弟学Android逆向01 编写第一个Android程序> <教我兄弟学Android逆向02 破解第一个Android程序 ...

  7. Carson带你学Android:你要的WebView与 JS 交互方式都在这里了

    前言 现在很多App里都内置了Web网页(Hybrid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 上述功能是由Android的WebView实现的,其中涉及到Android客户端与 ...

  8. Carson带你学Android:请收好这一份全面详细的Android学习指南

    前言 如果你也学习Android,那么你大概率会看过我的文章.经常有读者给我留言:"该怎么学习Android?"."日常学习Android的方法是什么". 今天 ...

  9. Carson带你学Android:源码解析自定义View Draw过程

    前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化 等 今天,我将全面总结自定义View ...

最新文章

  1. Redis 为什么是单线程的?
  2. ​通俗理解神经网络BP反向传播算法
  3. 信息学奥赛一本通C++语言——1124:矩阵加法
  4. CSS 与 HTML5 响应式图片
  5. Java的序列化特性将要退出历史舞台了
  6. vue修改Element的el-table样式
  7. CentOS 服务器搭建 mediawiki
  8. 记录——《C Primer Plus (第五版)》第九章编程练习第一题
  9. Jquery第二篇【选择器、DOM相关API、事件API】
  10. bootstrap16-上下文表格布局
  11. 移动硬盘上安装Windows 10系统
  12. 博科Brocade 300光纤交换机配置zone教程
  13. 二项式分布(Binomial Distribution)
  14. CEST日期格式转换为 年月日时分秒
  15. 特征可视化技术(CAM)
  16. 企业为什么需要信息化?
  17. Python - 深度学习系列13- 显卡与CPU计算对比
  18. html表单 access,【Access基础】OpenForm打开窗体方法详解
  19. DOS命令行下输入mount命令
  20. 用我的沃土编织你的穹顶:华为的欧洲告白

热门文章

  1. Face De-Spoofifing_ Anti-Spoofifing via Noise Modeling
  2. 使用GDB中的watch来调试指来指去的指针
  3. 优思学院|六西格玛线上课程视频
  4. 51单片机 串口通信 中断
  5. js 动态添加Word书签
  6. 七夕将至, RFM数据分析法帮你分析男朋友值不值得嫁
  7. email邮箱情缘:《电子情书 You've Got Mail》
  8. 金融业务-金融市场的概念和功能
  9. 春节期间台湾中部出租车加价 各县市行情不一
  10. 【目录】《电路》上下、《电力电子学》、《数字电路》