View 준비 사용자 정의: MeasureSpec 이해

4738 단어 Android
사용자 정의View의 onMeasure(int width Measure Spec, int height Measure Spec)에서 두 가지 파라미터의 의미를 파악하기 전에 Measure Spec Measure Spec는 안드로이드 시스템이 뷰 제작을 편리하게 하는 데 존재하는 도움말 클래스임을 이해할 필요가 있다.다음과 같이 AndroidStudio에서 소스를 복사하고 주석을 추가합니다.
public class MeasureSpec {
        /**     2 30  (int    32 ,
          *    30      int             32 31     )
          */
        private static final int MODE_SHIFT = 30;

        /**    ,0x3 16  ,10   3,    11。3    30,  11 00000000000(11  30 0)
          *(       1      ,0      。  1             ,
          *0          0)
          */
        private static final int MODE_MASK  = 0x3 << MODE_SHIFT;

        // 0    30,  00 00000000000(00  30 0)
        public static final int UNSPECIFIED = 0 << MODE_SHIFT;
        // 1    30,  01 00000000000(01  30 0)
        public static final int EXACTLY     = 1 << MODE_SHIFT;
        // 2    30,  10 00000000000(10  30 0)
        public static final int AT_MOST     = 2 << MODE_SHIFT;

        /**
         *      size mode           
         * measureSpec = size + mode;   (  :      ,  10     !)
         *             32      ,32 31    mode  , 30   size  
         *  size=100(4),mode=AT_MOST, measureSpec=100+10000...00=10000..00100
         */
        public static int makeMeasureSpec(int size, int mode) {
            return size + mode;
        }

        /**
         *           mode
         *mode = measureSpec & MODE_MASK;
         *MODE_MASK = 11 00000000000(11  30 0),
         *    MODE_MASK 30  0  measureSpec 30   1,   32 31  mode 。
         *  10 00..00100 & 11 00..00(11  30 0) = 10 00..00(AT_MOST),      mode  
         */
        public static int getMode(int measureSpec) {
            return (measureSpec & MODE_MASK);
        }

        /**
         *           size
         *size = measureSpec & ~MODE_MASK;
         *    ,      MODE_MASK  ,      00 111111(00  30 1),
         * 32,31   0     mode,   30  size
         */
        public static int getSize(int measureSpec) {
            return (measureSpec & ~MODE_MASK);
        }
}

MeasureSpec은 부모 View가 하위 View에 전달하는 레이아웃 제약을 봉인합니다. 각각의 MeasureSpec는 너비와 높이의 요구를 대표합니다.MeasureSpec은 Size와 Mode 두 부분으로 구성되어 있습니다.그 중에서 Mode는 int 유형의 높은 위치(전 두 자리)가 존재하고 사이즈는 나머지 낮은 위치를 차지하며 MASK(마스크)를 통해 분리된다.그에 대응하는 방법은 getSize()와 getMode()이다.Mode: 모드: 모 뷰의 하위 뷰 구속으로 이해되는 Type: 세 가지가 있습니다. 1.UNSPECIFIED 부모는 자식에 대한 구속이 없습니다.서브는 임의의 크기(즉, 지정되지 않은 것)(UNSPECIFIED의 원본 처리는 EXACTLY와 같을 수 있습니다. 뷰의 너비 값이 0으로 설정되었거나 너비가 설정되지 않았을 때 모델은 UNSPECIFIED 2.EXACTLY 부모 결정자의 정확한 크기입니다. 서브는 지정된 경계에 한정되어 있고 정확한 것은(width 또는 height가 match parent 또는 고정된 값으로 설정된 경우 EXACTLY 모드) 3.AT_MOST 서브뷰는 최대 크기, 최대의 의미(wrap content로 설정할 때 AT MOST로 서브뷰의 크기가 얼마나 되는지를 나타낸다. 이view는 이 상한선에 따라 자신의 사이즈를 설정한다)를 이렇게 봉인하여 2진법과 조작을 이용하여 부뷰의 의도(mode, size)를 서브뷰에 전달한다.서브뷰는 특정 상황에 따라 측정됩니다.

좋은 웹페이지 즐겨찾기