Section1
查看View源码中的
/** * Extracts the mode from the supplied measure specification. * * @param measureSpec the measure specification to extract the mode from * @return {@link android.view.View.MeasureSpec#UNSPECIFIED}, * {@link android.view.View.MeasureSpec#AT_MOST} or * {@link android.view.View.MeasureSpec#EXACTLY} */ @MeasureSpecMode public static int getMode(int measureSpec) { //noinspection ResourceType return (measureSpec & MODE_MASK); }
Section2
继续朝上找,有如下变量,
private static final int MODE_SHIFT = 30;
/** * Measure specification mode: The parent has not imposed any constraint * on the child. It can be whatever size it wants. */ public static final int UNSPECIFIED = 0 << MODE_SHIFT; /** * Measure specification mode: The parent has determined an exact size * for the child. The child is going to be given those bounds regardless * of how big it wants to be. */ public static final int EXACTLY = 1 << MODE_SHIFT; /** * Measure specification mode: The child can be as large as it wants up * to the specified size. */ public static final int AT_MOST = 2 << MODE_SHIFT;
这三个值是多少呢?
Section3
public static void main(String args[]){ System.out.println(getFullBinaryString(UNSPECIFIED)); System.out.println(getFullBinaryString(EXACTLY)); System.out.println(getFullBinaryString(AT_MOST)); } public static String getFullBinaryString(int num){ char [] mChars = new char [32]; for (int i = 0;i<32;i++){ mChars[31-i]= (char)((num>>i&1)+'0'); } return new String (mChars); }
打印结果如下:
09-26 18:24:07.975 8120-8120/? I/System.out: 00000000000000000000000000000000 09-26 18:24:07.975 8120-8120/? I/System.out: 01000000000000000000000000000000 09-26 18:24:07.975 8120-8120/? I/System.out: 10000000000000000000000000000000
========================================================
可以看到,这个其实就是利用了32位的int值的左侧两位存了 这三种状态。
顺便说下:
UNSPECIFIED 未指定
EXACTLY 指定
AT_MOST 指定了最大值