Android 에 서 는 컨트롤 을 측정 해 야 할 때 가 있 습 니 다.얻 은 컨트롤 의 너비 와 높이 를 계산 할 수 있 습 니 다.스크린 에 적응 해 야 하 는 상황 에서 이런 계산 은 특히 중요 하 다.또 다른 편리 함 은 수요 때문에 인터페이스 에 들 어가 면 컨트롤 의 너비 와 높이 를 얻 을 수 있 기 를 바 랍 니 다.안 타 깝 게 도 제 검증 에 따 르 면 인터넷 에 전 재 된 방법 으로 OnCreate 함수 에서 얻 은 것 은 0 입 니 다.예 를 들 어 Measure 방법 을 사용 한 후에 getMeasured Width 의 값 을 호출 하 는 것 입 니까?0 입 니까?OnCreate 함수 가 발생 했 을 때 데이터 초기 화 기 회 를 제 공 했 을 뿐 이 때 는 제대로 그래 픽 을 그리 지 않 았 기 때문이다.그리고 도형 을 그 리 는 것 은 OnDraw 에서 진행 되 는데 이때 계산 이 너무 늦 어 보인다.쉽게 생각 할 수 있 는 방법 은 프로그램 이 지정 한 컨트롤 을 측정 한 후에 너비 와 높이 를 즉시 계산 하거나 데이터 초기 화 를 하 기 를 바 라 는 것 이다.이 사건 의 발생 을 감청 하 는 방법 이 필요 합 니 다.다행히 안 드 로 이 드 는 이러한 메커니즘 을 제공 합 니 다.View 류 의 getView TreeObserver 방법 을 이용 하여 지정 한 View 의 관찰 자 를 얻 을 수 있 습 니 다.컨트롤 을 그리 기 전 순간 에 리 셋 을 할 수 있 습 니 다.이렇게 속도 가 지연 되 지 않 고 얻 은 데 이 터 는 정확 하지만 이 방법 은 나중에 반복 적 으로 호출 될 수 있 습 니 다.따라서 제한 을 넣 어야 합 니 다.일반적인 수요 에서 한 번 만 계산 하면 됩 니 다.코드 는 다음 과 같 습 니 다.(이 코드 는 OnCreate 리 셋 함수 에서 검증 을 통 과 했 습 니 다.실시 간 으로 모니터 이기 때문에 사건 이 발생 했 을 때 OnCreate 와 무관 합 니 다):
layout = (MetroLayout) findViewById(R.id.layout);
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
{
public boolean onPreDraw()
{
if (hasMeasured == false)
{
int height = metroLayout.getMeasuredHeight();
int width = metroLayout.getMeasuredWidth();
// ,
hasMeasured = true;
}
return true;
}
});