Android View 는 어떻게 측정 합 니까?

Android View 의 측정 에 대해 우 리 는 한 마디 로"위치 와 크기 를 주세요.거기 까지 자 랄 줄 알았어 요"라 고 요약 합 니 다.
여러분 들 이 이 결론 을 잘 이해 할 수 있 도록 저 는 일상생활 의 작은 이 야 기 를 하 겠 습 니 다.여러분 들 이'장님 그림 그리 기'게임 을 해 보 셨 는 지 모 르 겠 습 니 다.한 사람 은 눈 을 가리 고 펜 을 가지 고 화판 에 지정 한 그림 을 그 렸 습 니 다.다른 한 사람 은 그의'눈'이 라 고 생각 하고 언어 로 그 에 게 화판 의 그 위치 에 얼마나 큰 그림 을 그 렸 는 지 알려 드 리 겠 습 니 다.만약 이 사람 이 눈 을 가리 고 있 는 사람 에 게 말 하지 않 는 다 면,그것 에 얼마나 큰 그림 을 그 릴 것 인가?그러면 이 눈 을 가리 고 있 는 사람 은 이때 정말'강 에서 큰 차 를 몰 아 라--어 쩔 수 없다'.사실 안 드 로 이 드 는 바로 이 눈 을 가리 고 있 는 사람 이다.우 리 는 그 에 게 어떻게 그 리 는 지 정확하게 알려 줘 야 네가 원 하 는 도형 을 그 릴 수 있다.
여러분,안 드 로 이 드 레이아웃 측정 에 대해 현실 세 계 를 비교 하 셨 습 니까?View 의 구체 적 인 구 조 를 실현 하기 위해 Android 는 짧 고 간결 하 며 기능 이 강 한 클래스 인 measureSpec 류 를 설계 했다.그럼 엄 마 는 더 이상 걱정 안 하 셔 도 돼 요.그렇다면 MeasureSpec 은 도대체 무슨 귀신 일 까?MeasureSpec,결국 32 비트 int 값 입 니 다.이 중 고 2 위 는 측정 모드 를,저 30 위 는 뷰 의 크기 를 나타 낸다.이렇게 하면 무슨 좋 은 점 이 있 습 니까?이렇게 하면 비트 연산 을 통 해 운행 효율 을 높 인 다.
MeasureSpec 같은 것 을 알 고 맥 을 빼 려 면 반드시 측정 하 는 세 가지 모델 에 대해 알 아야 한다.
1.EXACTLY(정확 한)
View 의 layout 을 설정 하면height 속성 또는 layotwidth 속성 은 확 정 된 값 또는 matchparent(부모 용 기 를 채 울 때)시스템 은 View 측정 모드 를 EXACTLY 모드 로 설정 합 니 다.
  2.AT_MOST(최대 치)
즉,최대 값 모드 로 레이아웃 되 어 있 습 니 다.시스템 은 언제 View 를 AT 로 조정 합 니까?MOST 모드 입 니 다.View 의 layot 를 설정 하면height 속성 또는 layotwidth 속성 은 wrapcontent(소포 내용)때.
3.UNSPECIFIED(미 확정)
확 정 된 것 이 아니 라 크기 측정 모드 를 지정 하지 않 았 다 는 것 이다.뷰 는"마음 이 얼마나 큰 지,무대 가 얼마나 큰 지"라 는 것 이다.이 방법 은 일반적으로 사용자 정의 컨트롤 에서 만 사용 할 수 있 습 니 다.
View 측정 을 할 때 기본 값 은 EXACTLY 모드 입 니 다.궁금 할 수도 있 습 니 다.TextView,EditText 이 컨트롤 들 을 어떻게 wrap 을 지원 합 니까?content 속성 이 생 겼 습 니 다.혹시 그 가 OnMeasure 방법 을 다시 썼 습 니까?예,그들 은 모두 OnMeasure 방법 을 다시 썼 습 니 다.이것 이 바로 우리 가 컨트롤 을 사용자 정의 할 때 wrap 을 지원 하 는 레이아웃 을 만 드 는 이유 입 니 다.content 속성,onMeasure 방법 을 다시 써 서 wrap 을 지정 해 야 합 니 다.콘 텐 츠 는 정확 한 크기 입 니 다.
이 측정 모델 에 관 한 사고 도 는 반드시 이렇게 해 야 한다.
  
우 리 는 이렇게 많은 이론 적 지식 을 알 고 있 는데,지루 하고 도 그렇다 고 생각 하 는 것 이 아 닙 니까?좋 습 니 다.코드 에 직접 올 라 가서 MeasureSpec 가 측정 모드 와 측정 크기 를 어떻게 가 져 오 는 지 설명 하 겠 습 니 다.원본 코드 는 다음 과 같 습 니 다:
 자바 코드 는 다음 과 같 습 니 다:

public class MyView extends View {
  public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  
}
xml 코드 는 다음 과 같 습 니 다:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity" >
    
    <com.example.test.MyView 
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="#00ff00"
      />
</LinearLayout>
실행 효 과 는 다음 과 같 습 니 다.

이 짧 고 간결 한 예 를 통 해 이러한 결론 을 충분히 증명 할 수 있 습 니 다.View 측정 을 할 때 기본 값 은 EXACTLY 모드 입 니 다.OnMeasure 방법 을 다시 쓰 지 않 습 니 다.wrap 을 설정 하 더 라 도.content 속성,그 도 부모 용 기 를 채 웁 니 다.
그렇다면 Measure Spec 이라는 만금 유 류 를 통 해 OnMeasure 방법 을 다시 써 보 자.해당 소스 코드 는 다음 과 같 습 니 다.

  public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(measureWidth(widthMeasureSpec),
        measureWidth(heightMeasureSpec));
  }
  public int measureWidth(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);
    if (specMode == MeasureSpec.EXACTLY) {
      result = specSize;
    } else {
      result = 200;
      if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(specSize, result);
      }
    }
    return result;
  }
실행 효 과 는 다음 과 같 습 니 다:

같은 예 에서 우 리 는 OnMeasure 방법 을 다시 썼 을 뿐 MeasureSpec.getMode(measureSpec)를 통 해 측정 모드 를 얻 을 때 MeasureSpec.getSize(measureSpec)를 통 해 컨트롤 사 이 즈 를 얻 었 다.레이아웃 속성 을 wrap 로 판단 합 니 다.content,정확 한 값 으로 지정 되 었 습 니 다.이 때 컨트롤 은 wrap 에 부합 합 니 다.content 속성.
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기