文章目录

  • MeasureSpec
    • 1.概述
    • 2.MeasureSpec的3种模式

MeasureSpec

1.概述

  • MeasureSpec是View的内部类,它封装了view的高和宽的信息,其作用是在measure流程中,将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec,其源码如下:
 public static class MeasureSpec {private static final int MODE_SHIFT = 30;private static final int MODE_MASK  = 0x3 << MODE_SHIFT;/** @hide */@IntDef({UNSPECIFIED, EXACTLY, AT_MOST})@Retention(RetentionPolicy.SOURCE)public @interface MeasureSpecMode {}public static final int UNSPECIFIED = 0 << MODE_SHIFT;public static final int EXACTLY     = 1 << MODE_SHIFT;public static final int AT_MOST     = 2 << MODE_SHIFT;public static int makeMeasureSpec(@IntRange(from = 0, to = (1 << MeasureSpec.MODE_SHIFT) - 1) int size,@MeasureSpecMode int mode) {if (sUseBrokenMakeMeasureSpec) {return size + mode;} else {return (size & ~MODE_MASK) | (mode & MODE_MASK);}}public static int makeSafeMeasureSpec(int size, int mode) {if (sUseZeroUnspecifiedMeasureSpec && mode == UNSPECIFIED) {return 0;}return makeMeasureSpec(size, mode);}@MeasureSpecModepublic static int getMode(int measureSpec) {//noinspection ResourceTypereturn (measureSpec & MODE_MASK);}public static int getSize(int measureSpec) {return (measureSpec & ~MODE_MASK);}static int adjust(int measureSpec, int delta) {final int mode = getMode(measureSpec);int size = getSize(measureSpec);if (mode == UNSPECIFIED) {// No need to adjust size for UNSPECIFIED mode.return makeMeasureSpec(size, UNSPECIFIED);}size += delta;if (size < 0) {Log.e(VIEW_LOG_TAG, "MeasureSpec.adjust: new size would be negative! (" + size +") spec: " + toString(measureSpec) + " delta: " + delta);size = 0;}return makeMeasureSpec(size, mode);}public static String toString(int measureSpec) {int mode = getMode(measureSpec);int size = getSize(measureSpec);StringBuilder sb = new StringBuilder("MeasureSpec: ");if (mode == UNSPECIFIED)sb.append("UNSPECIFIED ");else if (mode == EXACTLY)sb.append("EXACTLY ");else if (mode == AT_MOST)sb.append("AT_MOST ");elsesb.append(mode).append(" ");sb.append(size);return sb.toString();}}

2.MeasureSpec的3种模式

  • 根据MeasureSpec的源码可知,MeasureSpec代表的是32位的int值,其中高2位代表SpecMode(模式),低30位代表SpecSize(大小).
  • SpecMode有3种模式:
  • UNSPECIFIED:未指定模式,View想多大就多大,父容器不做限制,一般用于系统内部的测量
  • AT_MOST:最大模式,对应于wrap_comtent属性,子View的最终大小是父View指定的SpecSize值,并且子View的大小不能大于这个值
  • EXACTLY:精确模式,对应于 match_parent 属性和具体的数值,父容器测量出 View所需要的大小,也就是SpecSize的值

理解MeasureSpec相关推荐

  1. 十八 、 View 的工作原理(2)---理解 MeasureSpec

    MeasureSpec 是什么: 它是 Android 源码中 View.java 中的一个静态内部类: public static class MeasureSpec {private static ...

  2. MeasureSpec源码解读

    文章目录 MeasureSpec的源码 MeasureSpec与LayoutParams 今天来讲讲MeasureSpec吧.因为他与View的测量流程相关性很大,只有正确的理解了MeasureSpe ...

  3. android view 绘制过程,深入理解Android中View绘制的三大流程

    前言 最近对Android中View的绘制机制有了一些新的认识,所以想记录下来并分享给大家.View的工作流程主要是指measure.layout.draw这三大流程,即测量.布局和绘制,其中meas ...

  4. Android自定义视图四:定制onMeasure强制显示为方形

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  5. Android View 测量流程(Measure)完全解析

    前言 上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而V ...

  6. 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理

    本节和<Android群英传>中的第3章Android控件架构与自定义控件详解有关系,建议先阅读该章的总结 第4章 View的工作原理 4.1 初始ViewRoot和DecorView ( ...

  7. Android自定义view之measure、layout、draw三大流程

    自定义view之measure.layout.draw三大流程 一个view要显示出来,需要经过测量.布局和绘制这三个过程,本章就这三个流程详细探讨一下.View的三大流程具体分析起来比较复杂,本文不 ...

  8. View的测量规则以及三大方法流程

    通过前面几篇的深入分析,相信大家对View的理解已经很深了,我们说了setContentView背后做了什么,说了View从xml加载到通过WindowManager添加View后的一系列操作,说了A ...

  9. Android高级特性笔记

    ##### 谈谈你对安卓签名的理解. ### 2.为什么WebView加载会慢呢? 这是因为在客户端中,加载H5页面之前,需要先初始化WebView,在WebView完全初始化完成之前,后续的界面加载 ...

  10. 【转载】Android 面试总结

    Android面试整理 本文转载自 xiao_nian 的Android面试整理 本文转载自 xiao_nian 的Android面试整理 本文转载自 xiao_nian 的Android面试整理 一 ...

最新文章

  1. Tensor Core技术解析(上)
  2. mAP@.5 含义:
  3. linux userdel删除用户命令
  4. 解决 LLVM 错误 fatal error: ‘csignal’ file not found
  5. 还在用Excel做数据分析?两大方法5分钟完成别人一天的工作
  6. 《Redis官方文档》Data types—数据类型
  7. python-object-twoxml-html_1
  8. C++/Qt 序列化操作
  9. Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性
  10. Java 算法 摆动序列
  11. Django安装与开发虚拟环境搭建01
  12. 【C004】VB - 数据文件(一)顺序文件
  13. 梯度下降算法(GD)—收敛速率证明
  14. 自动驾驶1-5: 感知要求Requirements for Perception
  15. 菜谱网 java 源码_基于JSP的美食网站食谱网站、javaweb源码
  16. 用JavaScript实现简单的乘法计算
  17. STM32精英版(正点原子STM32F103ZET6开发板)学习篇12——电容触摸按键实验
  18. 转盘式视觉筛选机及其图像识别系统
  19. 《Excel视频3》打印
  20. python requests 乱码

热门文章

  1. steam插件_Steam是如何了解一款游戏的?看了这篇文章会让你豁然开朗!
  2. PSNR-峰值信噪比
  3. Mac教程——创建txt文件、设置新建txt的快捷键方法
  4. CLodop start
  5. 英雄联盟数据分析专题(一)
  6. 四阶段法-交通分布预测方法-算法复现
  7. drools mysql_drools 介绍
  8. WIN7操作系统IE11的离线安装(有时间总结下)
  9. 如何关闭谷歌的安全搜索?
  10. 产生式系统实验(AI实验一)