Android View.onMeasure 방법 상세 설명 및 인 스 턴 스

4846 단어 AndroidView.onMeasure
Android View.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)
  • AT 라면MOST,specSize 는 가장 얻 을 수 있 는 공간 을 대표 합 니 다.
  • EXACTLY 라면 specSize 는 정확 한 사 이 즈 를 대표 합 니 다.
  • UNSPECIFIED 라면 컨트롤 사이즈 에 참고 할 만 한 가치 가 없습니다.
  • 2.그러면 이 모드 들 은 우리 가 평소에 설정 한 layot 매개 변수 fillparent, wrap_콘 텐 츠 가 무슨 상관 이 죠?
    코드 테스트 를 통 해 알 수 있 듯 이 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;
    }
    
    
    읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기