MeasureSpec介绍及使用详解

MeasureSpec介绍及使用详解一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成。它有三种模式:UNSPECIFIED(未

大家好,又见面了,我是你们的朋友全栈君。

  一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成。它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;AT_MOST(至多),子元素至多达到指定大小的值。

 

  它常用的三个函数:

  1.static int getMode(int measureSpec):根据提供的测量值(格式)提取模式(上述三个模式之一)

  2.static int getSize(int measureSpec):根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)

  3.static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)


  这个类的使用呢,通常在view组件的onMeasure方法里面调用但也有少数例外,看看几个例子:

 

  a.首先一个我们常用到的一个有用的函数,View.resolveSize(int size,int measureSpec)

 

8421     public static int resolveSize(int size, int measureSpec) {
8422 int result = size;
8423 int specMode = MeasureSpec.getMode(measureSpec);
8424 int specSize = MeasureSpec.getSize(measureSpec);
8425 switch (specMode) {
8426 case MeasureSpec.UNSPECIFIED:
8427 result = size;
8428 break;
8429 case MeasureSpec.AT_MOST:
8430 result = Math.min(size, specSize);
8431 break;
8432 case MeasureSpec.EXACTLY:
8433 result = specSize;
8434 break;
8435 }
8436 return result;
8437 }

  上面既然要用到measureSpec值,那自然表示这个函数通常是在onMeasure方法里面调用的。简单说一下,这个方法的主要作用就是根据你提供的大小和模式,返回你想要的大小值,这个里面根据传入模式的不同来做相应的处理。

  再看看MeasureSpec.makeMeasureSpec方法,实际上这个方法很简单:

9023         public static int makeMeasureSpec(int size, int mode) {
9024 return size + mode;
9025 }

  这样大家不难理解size跟measureSpec区别了。看看它的使用吧,ListView.measureItem(View child)

 

2464     private void measureItem(View child) {
2465 ViewGroup.LayoutParams p = child.getLayoutParams();
2466 if (p == null) {
2467 p = new ViewGroup.LayoutParams(
2468 ViewGroup.LayoutParams.MATCH_PARENT,
2469 ViewGroup.LayoutParams.WRAP_CONTENT);
2470 }
2471
2472 int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
2473 mListPadding.left + mListPadding.right, p.width);
2474 int lpHeight = p.height;
2475 int childHeightSpec;
2476 if (lpHeight > 0) {
2477 childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
2478 } else {
2479 childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
2480 }
2481 child.measure(childWidthSpec, childHeightSpec);
2482 }

  measureSpec方法通常在ViewGroup中用到,它可以根据模式(MeasureSpec里面的三个)可以调节子元素的大小。

  注意,使用EXACTLY和AT_MOST通常是一样的效果,如果你要区别他们,那么你就要使用上面的函数View.resolveSize(int size,int measureSpec)返回一个size值,然后使用你的view调用setMeasuredDimension(int,int)函数。

 

8406     protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
8407 mMeasuredWidth = measuredWidth;
8408 mMeasuredHeight = measuredHeight;
8409
8410 mPrivateFlags |= MEASURED_DIMENSION_SET;
8411 }

  然后你调用view.getMeasuredWidth,view.getMeasuredHeigth 返回的就是上面函数里的mMeasuredWidth,mMeasuredHeight的值。

  

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154855.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python 中的 type(), dtype(), astype()的区别

    python 中的 type(), dtype(), astype()的区别函数 说明 type() 返回数据结构类型(list、dict、numpy.ndarray等) dtype() 返回数据元素的数据类型(int、float等) 备注:1)由于list、dict等可以包含不同的数据类型,因此不可调用dtype()函数 2)np.array中要求所有元素属于同一数据类型,因此可调用d…

    2022年6月7日
    32
  • SPPNet网络模型[通俗易懂]

    SPPNet网络模型[通俗易懂]上篇文章详细阐述了R-CNN网络模型,本篇本章本来准备阐述Fast-RCNN模型的,介于SPP-Net模型有许多技巧性的技术可以在不同模型上使用,所以本篇详细分析下SPP-NetSPPNet论文:https://arxiv.org/abs/1406.4729SPPNet论文翻译:https://blog.csdn.net/mengduan…

    2022年6月9日
    28
  • 笔记本计算机运行程序,这几招让你的笔记本电脑运行速度变快 必学技巧「建议收藏」

    笔记本计算机运行程序,这几招让你的笔记本电脑运行速度变快 必学技巧「建议收藏」很多电脑用户一直都被电脑慢的问题困扰着,而电脑大神根本不把电脑慢当做电脑问题,因为让电脑变快的方法有很多,而且操作都巨简单。提高电脑速度的方法也能很多而且很容易操作,一切的难,只是来源于你没有学过而已,现在就跟着小编来学那些简单又使用的电脑技能吧。让电脑速度快10倍,大概会让人觉得很不可思议吧,而实际上,你羡慕的大神可能也只是因为学会了下面的12种提高电脑速度的方法:1、定期的,对电脑内的灰尘进行…

    2022年5月22日
    67
  • pki的应用包括哪些技术_新技术应用情况

    pki的应用包括哪些技术_新技术应用情况一、概述公钥基础设施(PublicKeyInfrastructure,简称PKI)是目前网络安全建设的基础与核心,是电子商务安全实施的基本保障,因此,对PKI技术的研究和开发成为目前信息安全领域的热点。本文对PKI技术进行了全面的分析和总结,其中包括PKI组成、PKI应用等,并对CA的开发做了简要分析。本文对PKI,特别是CA的开发、应用和普及具有一定的促进作用。二、PKI技术的信任服务…

    2025年7月17日
    4
  • python自动化测试—Python自动化框架及工具

    python自动化测试—Python自动化框架及工具1概述手续的关于测试的方法论,都是建立在之前的文章里面提到的观点:功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化后面所谈到的测试自动化也将围绕着接口自动化来介绍。本系列选择的测试语言是python脚本语言。由于其官方文档已经对原理有了比较清楚的解释,本文就不做一些多余的翻译工作了。偏向于实战部分,而且为了偏向实战,也会结合IDE工具和项目组织来进行讲解。理由如下:1.脚本语言,开发和迭代的效率极高2.第三方的扩展库极多,有很我现成的工具可以使用在正式进

    2025年5月28日
    2
  • 【Unity技能】做一个简单的NPC

    【Unity技能】做一个简单的NPC

    2022年1月2日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号