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


88

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

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

그래서, 제 질문은 : 드로잉 치수가 측정 치수와 다를 수 있습니까? 는 IF 된 onMeasure (INT, INT) 방법면 매개 변수로 주어진 레이아웃 요구 사항 ( widthMeasureSpecheightMeasureSpec는 , 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.