Android View.onMeasure 방법 상세 설명 및 인 스 턴 스
4846 단어 AndroidView.onMeasure
View 는 화면 에 measure(계산)와 layot(레이아웃)를 거 쳐 야 한 다 는 것 을 보 여 줍 니 다.
1.언제 onMeasure 방법 을 호출 합 니까?
컨트롤 의 부모 요소 가 이 컨트롤 을 놓 으 려 고 할 때 호출 됩 니 다.부모 요 소 는 하위 컨트롤 에 게 질문 을 합 니 다."얼마나 큰 곳 을 사용 하 시 겠 습 니까?"그리고 두 개의 매개 변 수 를 전달 합 니 다.width MeasureSpec 와 height MeasureSpec.
이 두 매개 변 수 는 컨트롤 이 얻 을 수 있 는 공간 과 이 공간 에 대한 메타 데 이 터 를 가리킨다.
더 좋 은 방법 은 View 의 높이 와 너 비 를 set Measured Dimension 방법 으로 전달 하 는 것 입 니 다.그러면 부모 에 게 컨트롤 을 직접 알려 줄 수 있 습 니 다.하위 컨트롤 을 얼마나 많이 설치 해 야 하 는 지 알려 줄 수 있 습 니 다.
다음 코드 세 션 은 onMeasure 를 다시 쓰 는 방법 을 보 여 줍 니 다.이 땅 의 빈 방법 은 높이 와 폭 을 계산 하 는 것 입 니 다.width HeightSpec 과 height Measure Spec 값 을 번역 하고 적당 한 높이 와 너비 값 을 계산 합 니 다.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
}
private int measureHeight(int measureSpec) {
// Return measured widget height.
}
private int measureWidth(int measureSpec) {
// Return measured widget width.
}
경계 파라미터―widthMeasureSpec 와 height MeasureSpec,효율 적 인 원인 은 정수 로 들 어 옵 니 다.사용 하기 전에 먼저 해 야 할 일 은 MeasureSpec 류 의 정적 방법 getMode 와 getSize 를 사용 하여 번역 하 는 것 입 니 다.아래 세 션 과 같 습 니 다.
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
specMode 의 값 에 따 르 면(MeasureSpec 는 3 가지 모델 이 있 는데 그것 이 바로 UNSPECIFIED,EXACTLY 와 AT 이다.MOST)코드 테스트 를 통 해 알 수 있 듯 이 width 나 height 를 fill 로 설정 합 니 다.parent 에서 용기 가 레이아웃 할 때 하위 view 를 호출 하 는 measure 방법 으로 들 어 오 는 모드 는 EXACTLY 입 니 다.하위 view 가 남 은 용기 의 공간 을 차지 하기 때문에 크기 가 확 정 됩 니 다.
wrap 로 설정 하면content 시 용기 가 들 어 가 는 것 은 AT 입 니 다.MOST 는 하위 뷰 의 크기 가 얼마나 되 는 지 를 나타 내 는데 이 뷰 는 이 상한 선 에 따라 자신의 사 이 즈 를 설정 합 니 다.하위 뷰 의 크기 가 정확 한 값 으로 설정 되 었 을 때 용기 가 들 어 오 는 것 은 EXACTLY 이 며,MeasureSpec 의 UNSPECIFIED 모드 는 아직 어떤 상황 에서 사용 되 는 지 발견 되 지 않 았 다.
View 의 onMeasure 방법 기본 동작 은 UNSPECIFIED 모드 일 때 mMinWidth(보통 0)또는 배경 drawable 의 최소 사 이 즈 를 설정 하 는 것 입 니 다.모드 가 EXACTLY 또는 AT 일 때MOST 시 사 이 즈 는 들 어 오 는 MeasureSpec 의 크기 로 설정 합 니 다.
바로 잡 아야 할 관념 이 있 습 니 다.fillparent 는 하위 view 가 남 은 용기 의 공간 을 차지 하고 앞 에 설 치 된 다른 view 공간 을 덮어 쓰 지 않 을 것 입 니 다.물론 뒤에 설 치 된 하위 view 는 분배 할 공간 이 없 기 때문에 fillparent 속성 은 레이아웃 순서 에 매우 중요 합 니 다.예전 에 생각 했 던 것 은 모든 용기 의 공간 을 꽉 채 웠 다 는 것 이다.어쩐지 구 글 이 2.2 버 전에 서 fill 을parent 이름 match 로 변경parent.
두 가지 상황 하에 서,너 는 반드시 이러한 제한 들 을 절대적 으로 처리 해 야 한다.일부 상황 에서 이 제한 을 초과 한 사 이 즈 를 되 돌 릴 수 있 습 니 다.이러한 상황 에서 부모 요 소 는 초 과 된 View 를 어떻게 처리 하 는 지,재단 또는 스크롤 등 기술 을 사용 할 수 있 습 니 다.
다음 프레임 코드 는 View 측정 을 처리 하 는 전형 적 인 실현 을 보 여 주 었 습 니 다.
자바 코드:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredHeight, measuredWidth);
}
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// Default size if no limits are specified.
int result = 500;
if (specMode == MeasureSpec.AT_MOST){
// Calculate the ideal size of your
// control within this maximum size.
// If your control fills the available
// space return the outer bound.
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY){
// If your control can fit within these bounds return that value.
result = specSize;
}
return result;
}
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
// Default size if no limits are specified.
int result = 500;
if (specMode == MeasureSpec.AT_MOST){
// Calculate the ideal size of your control
// within this maximum size.
// If your control fills the available space
// return the outer bound.
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY){
// If your control can fit within these bounds return that value.
result = specSize;
}
return result;
}
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.