Android on Measure, Measure Child, measure Children의 차이점
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
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를 다시 작성할 때 주의해야 합니다.
우선 위 두 개를 결합시켜 자신의 넓이를 측정한다.
그런 다음 서브뷰의 너비를 측정해야 합니다.
서브뷰를 측정하는 방법은 다음과 같습니다.
getChildCount view , view。
,subView.measure(int wSpec, int hSpec); // view
4
4
4
measureChildWithMargins(subView, intwSpec, int wUsed, int hSpec, int hUsed);
를 더했다이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.