Android on Measure, Measure Child, measure Children의 차이점

5019 단어
1. VIew에서 하위 뷰에 대한 measure() 작업을 수행합니다.
1. measureChildren (): 내부 호출 measureChild () 로 하위 보기마다 measure 작업
2. measureChild(): 지정된 하위 뷰에 대한 measure 작업
3. measureChildWithMargins(): measure에서 Margin과padding도 하위 보기 크기의 일부로 고려하기
2. measureChildWithMargins() 실행 프로세스:
1. child를 호출합니다.getLayoutParams() 하위 뷰의 LayoutParams 속성 얻기
1.1 이 방법은generateDefaultLayoutParams()를 다시 불러와서 ViewGroup에서 계승된 것으로 되돌려야 한다.MarginLayoutParams의 레이아웃 클래스 (예: LinearLayout.LayoutParams) 를 다시 불러오지 않으면 이 View의 XML 속성layoutmargin이 효력을 상실하고 measureChildWithMargins를 사용할 수 없음 ()
2. getChildMeasureSpec() 함수를 두 번 호출하여 아이의 보기 너비와 높이의 Spec(하위 보기의 측정 규격을 확정)을 각각 계산한다.
3. child를 호출한다.measure () 함수로 하위 보기의 최종 레이아웃 크기를 결정합니다.
셋째, 마지막으로 ResolveSize () 를 호출해서 높이를 가져오고 setMeasureDimension () 을 호출해서 그 자체가 차지하는 레이아웃 높이를 설정합니다.
android onmeasure View.java의 정의:
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {

        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),

                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));

}
 public static int getDefaultSize(int size, int measureSpec) {
        int result = size;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);

        switch (specMode) {
        case MeasureSpec.UNSPECIFIED: //   
            result = size;
            break;
        case MeasureSpec.AT_MOST: //  
        case MeasureSpec.EXACTLY: //  
            result = specSize;
            break;
        }
        return result;
    }

ViewGroup에서 다음을 수행합니다.
   protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec) {
        final int size = mChildrenCount;
        final View[] children = mChildren;
        for (int i = 0; i < size; ++i) {
            final View child = children[i];
            if ((child.mViewFlags & VISIBILITY_MASK) != GONE) {
                measureChild(child, widthMeasureSpec, heightMeasureSpec);
            }
        }
    }
   protected void measureChild(View child, int parentWidthMeasureSpec,
            int parentHeightMeasureSpec) {
        final LayoutParams lp = child.getLayoutParams();

        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
                mPaddingLeft + mPaddingRight, lp.width);
        final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
                mPaddingTop + mPaddingBottom, lp.height);

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    }
 protected void measureChildWithMargins(View child,
            int parentWidthMeasureSpec, int widthUsed,
            int parentHeightMeasureSpec, int heightUsed) {
        final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();

        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
                mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin
                        + widthUsed, lp.width);
        final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
                mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin
                        + heightUsed, lp.height);

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    }

설명:
4
  • measure는final로 수식하는 방법으로 다시 쓸 수 없습니다.외부에서 호출할 때view를 직접 호출합니다.measure(int wSpec, int hSpec). measure에서 onMeasure가 호출되었습니다.뷰를 사용자 정의할 때 onMeasure를 다시 쓰면 됩니다

  • 2. MeasureSpec은 모델과 사이즈를 포함하는 결합체로 우리가 구체적인 관심을 가질 필요가 없다.
    측정 시 MeasureSpec을 호출할 수 있습니다.getSize | getMode는 해당하는 크기와 모델을 얻을 수 있습니다.
    그런 다음 MeasureSpec을 사용합니다.makeMeasureSpec(size,mode); 를 사용하여 MeasureSpec 객체를 작성합니다.
    그럼 모디는 어떻게 왔어요?이 사용자 정의view를 사용할 때의layoutWith|height 매개 변수에 따라 결정되기 때문에 new를 마음대로 사용할 수 없습니다.
    사이즈는 스스로 지정할 수도 있고 measure Spec을 직접 사용할 수도 있습니다.getSize.
    3. 뷰의 경우 onMeasure를 다시 작성할 때 주의해야 합니다.
    사용자 정의view를 사용할 때 wrapcontent.그러면 onMeasure에서 setMeasuredDimension을 호출해야 합니다.
    뷰의 너비를 지정합니다.사용된 fillparent 또는 구체적인 dp 값그럼 슈퍼를 직접 사용하세요.onMeasure 하면 됩니다.
    4. ViewGroup의 경우 onMeasure를 다시 작성할 때 주의해야 합니다.
    우선 위 두 개를 결합시켜 자신의 넓이를 측정한다.
    그런 다음 서브뷰의 너비를 측정해야 합니다.
    서브뷰를 측정하는 방법은 다음과 같습니다.
  • getChildAt(int index).index에 있는 자view를 받을 수 있습니다
          getChildCount   view   ,       view。
    
          ,subView.measure(int wSpec, int hSpec); //   view       
    

  • 4
  • 또는viewGroup의 서브뷰를 측정하는 방법을 호출한다.//어떤 서브뷰는 넓이, 높이, 내부에viewGroup의padding값인measurechild(subView, int wSpec, int hSpec)를 더한다

  • 4
  • //모든 서브뷰는 폭이 얼마나 넓고 높은지 내부에서 measure Child 방법인 measure Children(int wSpec, int hSpec)을 호출했다

  • 4
  • //어떤 자view는 넓이, 높이가 많고 내부에viewGroup의padding값,margin값과 전송된 넓이가 wUsed,hUsed
      measureChildWithMargins(subView, intwSpec, int wUsed, int hSpec, int hUsed); 
    를 더했다
  • 좋은 웹페이지 즐겨찾기