MeasureSpec内容

项目中看见一行代码很有趣,自定义了一个gridview。这个自定义中 重写了 onmeasure方法:

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

    }

没见过啊 然后我就研究一下 发现蛮有趣的。

这串代码的背景::可能经常遇到嵌套ListView、ScrollView的问题,百度一搜,都是现成的代码,而且都是一样的,就是重写onMeasure方法

首先 在 Android里面,用32位的int值来表示一个控件的模式与大小。

模式用最高两位表示:

      private static final int MODE_SHIFT = 30;

    • public static final int UNSPECIFIED = 0 << MODE_SHIFT;
    • public static final int EXACTLY = 1 << MODE_SHIFT;(相当于match——parent)
    • public static final int AT_MOST = 2 << MODE_SHIFT;(相当于wrap——content)

      不确定模式是0左移30位,也就是int类型的最高两位是00
      精确模式是1左移30位,也就是int类型的最高两位是01
      最大模式是是2左移30位,也就是int类型的最高两位是10kop

低位30位表示大小。

所以Integer.MAX_VALUE >> 2就是将 Integer.MAX_VALUE这个32位的值右移两位 。就保留下了 大小  也就是size值。

MeasureSpec.AT_MOST 这个模式值就相当于 给出了 模式值 这个 32位数的前两位。

以此,MeasureSpec的makeMeasureSpec的方法根据输入的大小值 与模式值来生成一个32位t值,这个int值封装了模式和大小信息

再通过 MeasureSpec的两个组装方法:

public static int getMode(int measureSpec),这个方法的作用是通过一个int值来获取里面的模式信息
public static int getSize(int measureSpec),这个方法的作用是通过一个int值来获取里面的大小信息

最后super.onMeasure(widthMeasureSpec, expandSpec);实现onmeasure全部功能。

最后根据这个例子讲一下怎么理解这一串代码:

给出了控件最大极限的size(实际不可能这么大),与 atmost模式   就是说 根据32位值 计算调整 将结果的大小值传递给父控件。

super.onMeasure(widthMeasureSpec, expandSpec);说明 调整的只是 高度  宽度不改变。
时间: 2024-11-14 14:02:24

MeasureSpec内容的相关文章

Android自定义ViewGroup,内容过长时可设置&quot;...&quot;截断

一.效果 二.实现 1.自定义View public class FeatureGroupView extends ViewGroup{ //itemSpaceVertical为列与列之间的间距 private int itemSpaceVertical, itemSpaceHorizontal, maxLineNum; private int paddingTop, paddingBottom, paddingLeft, paddingRight; private int moreTextCo

MeasureSpec

在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式. 这个大小的模式,有点难以理解.在系统中组件的大小模式有三种: 1.精确模式(MeasureSpec.EXACTLY) 在这种模式下,尺寸的值是多少,那么这个组件的长或宽就是多少. 2.最大模式(MeasureSpec.AT_MOST) 这个也就是父组件,能够给出的最大的空间,当前组件的长或宽最大只能为这么大,当然也可以比这个小. 3.

Android -- MeasureSpec

自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小. protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) onMeasure传入的两个参数是由上一层控件传入的大小,有多种情况,重写该方法时需要对计算控件的实际大小,然后调用setMeasuredDimension(int, int)设置实际大小. onMeasure传入的widthMeasureSpec和heightMe

MeasureSpec 解析

MeasureSpec 1.A MeasureSpec is comprised of a size and a mode. 打印成二进制: MODE_MASK=11000000000000000000000000000000, //0011左移动30位得到 ~MODE_MASK =  00111111111111111111111111111111: size & ~MODE_MASK  :  MeasureSpec 是个32位的int型,后三十位是是分配给size的. 2.mode有三种:

ANDROID自定义视图——onMeasure流程,MeasureSpec详解

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 而这篇文章就来谈谈第一步,也是十分关键得一步:"测量(Measure)" Measure(): Measure的中文意思就是测量.所以它的

Android中自定义View的MeasureSpec使用

有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/guide/topics/ui/custom-components.html 一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小. protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) onMeasure传

MeasureSpec学习

在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式. 这个大小的模式,有点难以理解.在系统中组件的大小模式有三种: 1.精确模式(MeasureSpec.EXACTLY) 在这种模式下,尺寸的值是多少,那么这个组件的长或宽就是多少. 2.最大模式(MeasureSpec.AT_MOST) 这个也就是父组件,能够给出的最大的空间,当前组件的长或宽最大只能为这么大,当然也可以比这个小. 3.

关于View的MeasureSpec说明

一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小. protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) onMeasure传入的两个参数是由上一层控件传入的大小,有多种情况,重写该方法时需要对计算控件的实际大小,然后调用setMeasuredDimension(int, int)设置实际大小. onMeasure传入的widthMeasureSpec和hei

Android的onMeasure和onLayout And MeasureSpec揭秘

Android中自定义ViewGroup最重要的就是onMeasure和onLayout方法,都需要重写这两个方法,ViewGroup绘制 的过程是这样的:onMeasure → onLayout → DispatchDraw [java] view plaincopy 其实我觉得官方文档解释有大大的问题,刚开始一直很疑惑onMeasure和onLayout是什么意思,看了很多资料后豁然开朗,总结如下 首先要知道ViewGroup是继承View的,后面的解释跟View有关.ViewGourp可以