对MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE 2, MeasureSpec.AT_MOST)的一点理解

article/2025/8/25 17:07:08

之前 遇到ScrollView中嵌入ListView,GridView冲突的解决(让ListView全显示出来) 链接
网上查找资料,代码大致如下:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;public class ListViewMeasur extends ListView {public ListViewMeasur(Context context, AttributeSet attrs) {super(context, attrs);}public ListViewMeasur(Context context) {super(context);}public ListViewMeasur(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}
}

其中对这段代码有疑惑:

	@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}

网上也有解释的文章 比如链接 文章对 测量模式模式的讲解十分详细,但是本文通过源码来进一步理解。

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST); 

作为参数onMeasure()方法,很明显作为代表测量的高度

super.onMeasure(widthMeasureSpec, expandSpec);

那接下来通过源码看一下调用的suMeasureSpec.makeMeasureSpec()方法。

    public static int makeMeasureSpec(int size, int mode) {if (sUseBrokenMakeMeasureSpec) {return size + mode;} else {return (size & ~MODE_MASK) | (mode & MODE_MASK);}}

MeasureSpec是一个32位的int值,其中高2位代表测量模式,低30位代表测量大小。
在makeMeasureSpec中看大 return size + mode; 现在通过一段代码模拟一下这个过程。
模拟makeMeasureSpec 输出的是10011111111111111111111111111111
最高两位是10的时候表示"最大模式"。即MeasureSpec.AT_MOST

public class URShift {private static final int MODE_SHIFT = 30;public static final int AT_MOST     = 2 << MODE_SHIFT;public static void main(String[] args) {int i =Integer.MAX_VALUE ;System.out.println(Integer.toBinaryString(i));//~1111111111111111111111111111111System.out.println(Integer.toBinaryString(makeMeasureSpec(Integer.MAX_VALUE >> 2,AT_MOST)));//~10011111111111111111111111111111}public static int makeMeasureSpec(int size, int mode) {return size + mode;}
}

其实MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST)就是生成一个符合MeasureSpec的一个32位的包含测量模式和测量高度的int值。

我是IT小王,如果喜欢我的文章,可以扫码关注我的微信公众号
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Oj6A62lR.shtml

相关文章

View的基本概念与MeasureSpec

1.基本概念 View的绘制是由measuer、layout、draw三个过程才能完整的绘制一个View&#xff0c;其中measure是测量View的宽、高&#xff0c;layout是为了确认View在父容器所在的位置&#xff0c;draw是负责在屏幕上将View绘制出来。View的绘制流程是从ViewRoot的performTraversa…

Android之:了解MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE 2,MeasureSpec.AT_MOST)

在自定义View和ViewGroup的时候&#xff0c;我们经常会遇到int型的 MeasureSpec 来表示一个组件的大小&#xff0c;这个变量里面不仅有组件的尺寸大小&#xff0c;还有大小的模式。 这个大小的模式&#xff0c;有点难以理解。在系统中组件的大小模式有三种&#xff1a; 1.精确…

Android开发 MeasureSpec介绍

搬家后的博客链接: IT客栈 www.itkezhan.org 在自定义View和ViewGroup的时候&#xff0c;我们经常会遇到int型的MeasureSpec来表示一个组件的大小&#xff0c;这个变量里面不仅有组件的尺寸大小&#xff0c;还有大小的模式。 这个大小的模式&#xff0c;有点难以理解。在系统中…

Android-测量规格(MeasureSpec)

目录 一、简介二、组成三、具体使用 一、简介 二、组成 测量规格(MeasureSpec)是由测量模式(mode)和测量大小(size)组成&#xff0c;共32位(int类型)&#xff0c;其中&#xff1a; 测量模式(mode)&#xff1a;占测量规格(MeasureSpec)的高2位&#xff1b;测量大小(size)&…

MeasureSpec学习 - 转

在自定义View和ViewGroup的时候&#xff0c;我们经常会遇到int型的 MeasureSpec 来表示一个组件的大小&#xff0c;这个变量里面不仅有组件的尺寸大小&#xff0c;还有大小的模式。 这个大小的模式&#xff0c;有点难以理解。在系统中组件的大小模式有三种&#xff1a; 1.精确…

MeasureSpec介绍

在自定义View和ViewGroup的时候&#xff0c;我们经常会遇到int型的MeasureSpec来表示一个组件的大小&#xff0c;这个变量里面不仅有组件的尺寸大小&#xff0c;还有大小的模式。 这个大小的模式&#xff0c;有点难以理解。在系统中组件的大小模式有三种&#xff1a; 1.精确模式…

Android 中MeasureSpec的创建规则

概述 在Android中&#xff0c;View的onMeasure()方法用来对控件进行测量&#xff0c;确定控件的宽高。该方法的两个参数widthMeasureSpec和heightMeasureSpec由父View计算后传入子view的measure()方法&#xff0c;再由子view的measure()方法传入onMeasure()方法&#xff0c;本…

关于google浏览器打不开网页问题之容易被忽略的点

其实google浏览器打不开 网页&#xff0c;原因网上有好多种&#xff0c;包括什么关闭防火墙、取消高级设置LAN单选框等&#xff0c;我也都试了&#xff0c;搞到最后要崩溃了&#xff0c;后来无意中&#xff0c;我输入一个http://baidu.com然后enter管用了&#xff0c;能打开页面…

谷歌浏览器打不开网页

今天起来发现谷歌浏览器和IE都打不开网页了&#xff0c;估计是我电脑代理又被修改了 在谷歌浏览器的设置--> 高级 --> 打开代理设置中 取消勾选即可修复问题。

关于谷歌浏览器打不开的解决方法

关于谷歌浏览器打不开的解决方法 打开Google,搜索&#xff0c;出现下面的问题&#xff0c;怎么解决呢&#xff0c;下面两种方法提供参考。 打开Google,首页显示输入网址&#xff0c;我们可以输入任意一个网址&#xff0c;例如www.baidu.com,然后就可以搜索了。 打开选项-设置…

谷歌浏览器(chrome)无法正常打开网页的解决办法

在网上看到许多新手想使用谷歌浏览器但是下载安装之后却无法打开网页 分析原因如下&#xff1a; 一般都是因为谷歌浏览器默认的地址栏搜索引擎为goole&#xff0c;由于goole属于国外的网站&#xff0c;我们访问是需要fan qiang才能访问的&#xff0c;所以无法打开网页。所以我…

chrome双击突然打不开的解决办法

这个也是没有想到&#xff0c;浪费了我挺长时间。我电脑的chrome突然打不开了&#xff0c;打不开的意思是双击了之后没有反应&#xff0c;但是其实是有打开进程的&#xff0c;这个就很坑。 网上搜了很多&#xff0c;什么把进程给杀掉的&#xff0c;重启电脑的&#xff0c;重装c…

Outlook 突然打不开

打开电脑正准备上班然后outlook崩了&#xff0c;报错建议我重装软件。。问题是现在用的都是365全家桶&#xff0c;也没办法单独重装一个outlook。盲试了一把repair居然修好了..再后来就经常用到它T_T..&#xff08;不是什么好事&#xff09; 首先有几种临时解决方法。 如果时间…

谷歌浏览器任何页面都打不开连设置也不能打开

谷歌浏览器任何页面都打不开 设置不能打开 找到谷歌右击选择属性 点击目标在最后加上 -no-sandbox即可解决 一定记得在 -no-sandbox前加上空格

谷歌浏览器网页打不开怎么办

首次下载谷歌浏览器&#xff0c;打开时在搜索框输入特定的网址会出现下面的界面 相信很多小伙伴也为此苦恼&#xff0c;今天小编为大家分享一个解决方法。 1.在其他其他浏览器搜索【极简插件】如下&#xff1a; 2.在右上角的搜索框里搜索【IGG】 点击推荐下载 3.将下载的压…

Chrome应用商店打不开问题

Chrome浏览器作为谷歌的亲儿子&#xff0c;实力方面很强。可是Chrome自从退出中国市场后一直对国内用户不太友好&#xff0c;但也还是有一批Chrome的忠实粉一直在用Chrome。 Chrome应用商店中有很多好玩实用的插件&#xff0c;我们在国内打开Chrome应用商店时是这样子的&#…

google打不开?更改一下chrome设置,畅通无阻玩谷歌

最近不知道是怎么回事&#xff0c;google&#xff08;谷歌&#xff09;一直打不开&#xff0c;gmail也是时断时续&#xff0c;十分痛苦。google服务对于的重要性不言而喻&#xff0c;特别是做 一些国外的项目&#xff0c;google的服务中断会严重影响收益。其实&#xff0c;只要…

sql 抛出异常raiserror()

说明 用于抛出一个异常或错误。这个错误可以被程序捕捉到。 实例 declare error_mes varchar(1000) set error_mes1314520886的ERP_ICStockBillEntry中间表数据的收料仓库编码不存在于系统中 raiserror(error_mes,13,1,张三)输出

SQL 中 RAISERROR 的用法

raiserror 是由单词 raise error 组成 raise 增加; 提高; 提升 raiserror 的作用 &#xff1a; raiserror 是用于抛出一个错误。[ 以下资料来源于sql server 2005的帮助 ] 其语法如下&#xff1a; RAISERROR ( { msg_id | msg_str | local_variable } …

RAISERROR (Transact-SQL)

从msdn上找到的&#xff0c;很详细了生成错误消息并启动会话的错误处理。RAISERROR 可以引用 sys.messages 目录视图中存储的用户定义消息&#xff0c;也可以动态建立消息。该消息作为服务器错误消息返回到调用应用程序&#xff0c;或返回到 TRY…CATCH 构造的关联 CATCH 块。 …