Android SDK에서 getWidth / Height ()와 getMeasuredWidth / Height ()의 차이점은 무엇입니까?


88

안드로이드 문서는 말한다 뷰의 두 가지 크기가 있다는 것을 측정 치수 와 도면 치수 . 측정 된 치수는 측정 패스 ( onMeasure 메서드) 에서 계산 된 치수이고 드로잉 치수 는 화면의 실제 크기입니다. 특히 문서는 다음과 같이 말합니다.

이러한 값은 측정 된 너비 및 높이와 다를 수 있지만 반드시 그럴 필요는 없습니다.

그래서, 제 질문은 : 드로잉 치수가 측정 치수와 다를 수 있습니까? 는 IF 된 onMeasure (INT, INT) 방법면 매개 변수로 주어진 레이아웃 요구 사항 ( widthMeasureSpec 및 heightMeasureSpec는 , SDK가 결정하는 방법 할 수 뷰는 다른 도면의 크기를 가져야한다고?

또한 Android 소스 코드 에서 측정 된 너비 / 높이를 사용하여 드로잉 너비 / 높이를 계산하는 방법 / 위치는 무엇입니까? View source code 를 살펴 보려고 했지만 measureWidth / Height를 사용하여 최종 너비 / 높이를 계산하는 방법을 알 수 없습니다. 패딩과 관련이 있을지 모르지만 확실하지 않습니다.


스크롤이 뷰에 추가되면 이러한 조치가 다를 수 있다고 생각합니다.
— Yury

아마도 사용자 정의 ViewGroup을 개발했으며 이것은 내 코드에서 발생합니다. 이 동작이 발생하는 지점까지 스크롤을 다루지 않습니다. 그래서 저는 여기에 스크롤 이상의 것이 있어야한다고 생각합니다.
— lgfischer 2011

나는 주어진 종횡비를 강제하기 위해 사용자 정의 ViewGroup도 개발자임을 확인합니다. 폭과 높이를 강제로 측정했지만 (제안 된 것보다 낮거나 같음) 결과적으로 실제 너비와 높이가 변경되지 않았습니다 (측정 된 값이 아님). 스크롤과는 관련이 없습니다. 실제 너비와 높이를 강제하는 방법을 찾을 수 없습니다.
— ARLabs

답변:


96

이름에서 알 수 있듯이 measureWidth / height는 측정 및 레이아웃 단계에서 사용됩니다.

예를 들어 보겠습니다.

위젯은 자체 측정을 ​​요청받으며, 위젯은 200px x 200px를 원한다고 말합니다. 이것은 측정 된 너비 / 높이입니다.

레이아웃 단계, 즉 onLayout 메소드에서. 메서드는 자식의 측정 된 너비 / 높이를 사용하거나 뷰의 레이아웃 메서드를 호출하여 새로운 너비 / 높이를 할당 할 수 있습니다.

onLayout 메서드가 childview.layout (0,0,150,150)을 호출한다고 가정하겠습니다. 이제 뷰의 너비 / 높이가 측정 된 너비 / 높이와 다릅니다.

onLayout 메서드 외부에서 MeasuringWidth / height를 사용하지 않는 것이 좋습니다.

요약 .

  1. onMeasure-> MeasureWidth / measuredHeight 설정
  2. onLayout-> 위젯의 너비 / 높이를 설정합니다.

또한
public void View.layout(int l, int t, int r, int b)
위치와 크기가 할당되는 장소 인 것 같습니다.


즉, 뷰의 "실제"차원을 얻으려면 항상 getWidth / getHeight를 사용해야합니다.
— suitianshi

1
예,하지만 자체 레이아웃을 수행하는 경우 너비 대신 measureWidth를 사용해야합니다.
— Prakash Nadar

그렇다면 onMeasure () 내부에 치수를 설정하는 목적은 무엇입니까? 내 말은, 레이아웃 패스에 관계없이 측정 된 치수, possibliy을 뷰의 최종 크기를 설정하는 마지막 하나입니다
— edoardotognoni

@edoardotognoni 레이아웃 (LinearLayout, RelativeLayout 또는 사용자 지정 레이아웃)에 따라보기에 올바른 크기와 위치를 제공합니다.
— Prakash Nadar

좋아, 뷰가 "이 치수를 원합니다"라고 말합니다. 레이아웃에 "이 치수를 갖게됩니다"라고 표시됩니다. 맞아?
— edoardotognoni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.