IT story

렌더링하기 전에 뷰 측정

hot-time 2020. 12. 30. 19:18
반응형

렌더링하기 전에 뷰 측정


뷰를 부모에 연결 한 후 뷰가 얼마나 커질 지 알아야합니다.

이 방법을 재정의했습니다.

onMeasure(int, int);

하지만이 메서드는 실제로 다음을 사용하여 컨테이너에 사용자 정의 뷰를 추가 할 때만 호출되는 것처럼 보입니다.

addView(myView);

뷰 자체를 렌더링하기 전에이 정보를 얻을 수있는 방법이 있다고 생각하십니까? 기본적으로 첨부하기 전에 실제 크기를 알아야하며 일정 공간이 더 많이 필요하면 뷰를 전혀 첨부하지 않습니다.

아무도?


당신이 얻고 싶은 경우에 활동하기 전에 폭과 높이를 측정, 그 뷰 계층에 추가하고 전화를해야합니다 그것을 밖으로 누워있다 measure()View호출하기 전에 자신 getMeasuredWidth()또는 getMeasuredHeight().

측정 된 너비와 높이는 measure가 호출 된 후에 설정되므로 (이는를 호출 함 onMeasure())이 지점 이전에 0을 반환합니다. 귀하 의 필요에 따라 MeasureSpecs 를 제공 measure(..)해야합니다.

자식이 스스로 제약을 부과 할 수있게 해주는 MeasureSpecs는 다음과 같습니다.

int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY);
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY);

중요한 점 . (새 API에서 변경됨) 위에서 전달 된 너비는 명시 적 px 또는 ViewGroup.LayoutParams.WRAP_CONTENT또는 ViewGroup.LayoutParams.FILL_PARENT.

또한 뷰가 실제 대상 계층에서 측정 될 때 전달 될 MeasureSpec이 포함 된 레이아웃 논리를 기반으로measure() 구성 된다는 점도 주목할 가치 가 있습니다 . 이 부모 viewGroup / 자체 레이아웃 제약 / 형제 자식 뷰의 제약 조건에서 고려할 때 첫 번째 측정 값이 유효하지 않으면 두 번 이상 호출 될 수 있습니다. 측정 된 크기에 따라 로직을 구현하기 전에 호출을 기다리지 않으면 최종 결과를 얻기가 어려울 것입니다 (상황에 따라 다름).ViewGroupsviewGroupmeasure()measuredWidth & height위의 솔루션에서, 그러나 모든 경우에 위의 기술을 사용하여 목적에 맞았지만 비교적 간단했습니다. 실제로 컨텍스트에서 측정해야하는 경우를 onLayout()반환 한 후에 수행하고 변경 사항을 명시 적으로 requestLayout()다시 설정해야 합니다.


OnMeasure는 View의 크기를 알려주지 않습니다. 대신, 상위 뷰에 의해 적용되는 몇 가지 제약을 제공하여 사용자 정의 뷰에 크기를 설정하도록 요청합니다.

이것은 SDK 문서에서 가져온 것입니다.

첫 번째 쌍은 측정 된 너비와 측정 된 높이로 알려져 있습니다. 이러한 차원은 뷰가 부모 내에서 원하는 크기를 정의합니다 (자세한 내용은 레이아웃 참조). 측정 된 차원은 getMeasuredWidth () 및 getMeasuredHeight ()를 호출하여 얻을 수 있습니다.

두 번째 쌍은 단순히 너비와 높이 또는 때로는 그리기 너비와 그리기 높이로 알려져 있습니다. 이러한 치수는 화면에서, 그리기 시간 및 레이아웃 이후에보기의 실제 크기를 정의합니다. 이러한 값은 측정 된 너비 및 높이와 다를 수 있지만 반드시 그럴 필요는 없습니다. 너비와 높이는 getWidth () 및 getHeight ()를 호출하여 얻을 수 있습니다.

레이아웃 후 getWidth () 및 getHeight ()를 호출하여 사용자 정의보기의 최종 크기를 찾을 수 있습니다.


첫 번째 전화

 view.measure(0, 0);

그런 다음

view.getMeasuredWidth() 또는 view.getMeasuredHeight()


getMesauredWith () 및 getMeasuredHeight ()를 사용할 수 있어야합니다.

http://developer.android.com/reference/android/view/View.html#getMeasuredWidth%28%29


나는 같은 문제가 있습니다. 유일한 방법은 먼저 렌더링 한 다음 크기 조건을 충족하면 제거하는 것 입니다. 약간 이상하게 보이지만 Android는 그림을 그린 후에 만 ​​치수를 아는 것 같습니다.

참조 URL : https://stackoverflow.com/questions/2827079/measuring-a-view-before-rendering-it

반응형