理解MeasureSpec
文章目录
- 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相关推荐
- 十八 、 View 的工作原理(2)---理解 MeasureSpec
MeasureSpec 是什么: 它是 Android 源码中 View.java 中的一个静态内部类: public static class MeasureSpec {private static ...
- MeasureSpec源码解读
文章目录 MeasureSpec的源码 MeasureSpec与LayoutParams 今天来讲讲MeasureSpec吧.因为他与View的测量流程相关性很大,只有正确的理解了MeasureSpe ...
- android view 绘制过程,深入理解Android中View绘制的三大流程
前言 最近对Android中View的绘制机制有了一些新的认识,所以想记录下来并分享给大家.View的工作流程主要是指measure.layout.draw这三大流程,即测量.布局和绘制,其中meas ...
- Android自定义视图四:定制onMeasure强制显示为方形
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- Android View 测量流程(Measure)完全解析
前言 上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而V ...
- 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理
本节和<Android群英传>中的第3章Android控件架构与自定义控件详解有关系,建议先阅读该章的总结 第4章 View的工作原理 4.1 初始ViewRoot和DecorView ( ...
- Android自定义view之measure、layout、draw三大流程
自定义view之measure.layout.draw三大流程 一个view要显示出来,需要经过测量.布局和绘制这三个过程,本章就这三个流程详细探讨一下.View的三大流程具体分析起来比较复杂,本文不 ...
- View的测量规则以及三大方法流程
通过前面几篇的深入分析,相信大家对View的理解已经很深了,我们说了setContentView背后做了什么,说了View从xml加载到通过WindowManager添加View后的一系列操作,说了A ...
- Android高级特性笔记
##### 谈谈你对安卓签名的理解. ### 2.为什么WebView加载会慢呢? 这是因为在客户端中,加载H5页面之前,需要先初始化WebView,在WebView完全初始化完成之前,后续的界面加载 ...
- 【转载】Android 面试总结
Android面试整理 本文转载自 xiao_nian 的Android面试整理 本文转载自 xiao_nian 的Android面试整理 本文转载自 xiao_nian 的Android面试整理 一 ...
最新文章
- Tensor Core技术解析(上)
- mAP@.5 含义:
- linux userdel删除用户命令
- 解决 LLVM 错误 fatal error: ‘csignal’ file not found
- 还在用Excel做数据分析?两大方法5分钟完成别人一天的工作
- 《Redis官方文档》Data types—数据类型
- python-object-twoxml-html_1
- C++/Qt 序列化操作
- Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性
- Java 算法 摆动序列
- Django安装与开发虚拟环境搭建01
- 【C004】VB - 数据文件(一)顺序文件
- 梯度下降算法(GD)—收敛速率证明
- 自动驾驶1-5: 感知要求Requirements for Perception
- 菜谱网 java 源码_基于JSP的美食网站食谱网站、javaweb源码
- 用JavaScript实现简单的乘法计算
- STM32精英版(正点原子STM32F103ZET6开发板)学习篇12——电容触摸按键实验
- 转盘式视觉筛选机及其图像识别系统
- 《Excel视频3》打印
- python requests 乱码