본문 바로가기
개발/안드로이드

ViewTreeObserver - 뷰의 위치, 레이아웃 그려지는 시점 알아내기

by darksilber 2017. 1. 31.
반응형

출처 - http://dwfox.tistory.com/30

 

 

 

ViewTreeObserve


뷰의 위치(높이,  넓이) 구하기, 레이아웃 그려지는 시점 알아내기

# 뷰가 그려지지 않을때 혹은 / 뷰의 높이가 0일때 참고


   ViewTreeObserve 란


ViewTreeObserve - http://developer.android.com/intl/ko/reference/android/view/ViewTreeObserver.html


뷰 트리 관찰자가 View 트리에서 글로벌 변경 알림을 받을 수 있는 리스너를 등록 하는데 사용 된다.

이름에서 알 수 있듯 뷰트리에 대한 옵저버 역할을 하게 된다. 

View가 생성되기 전에 View의 위치나 크기를 구하려고 하면 아직 View의 위치가 실제로 화면에 변경되기 전에 값을 가져오므로 0이나 Null값을 가져오게 될것이다.

그래서 ViewTreeObserve를 이용하여 리스너를 등록하고 리스너를 통해 뷰의 크기나 위치를 가져오는 시점으로 사용하면 값을 가져올 수 있다.




   ViewTreeObserve 가져오기 getViewTreeObserve


getViewTreeObserve  - http://developer.android.com/intl/ko/reference/android/view/View.html#getViewTreeObserver()

최상위 클래스인 View 클래스에서 getViewTreeObserve()를 통하여 ViewTreeObserve를 가져온다.

imageView = (ImageView)findViewById(R.id.bitmap);
ViewTreeObserver viewTreeObserver = imageView.getViewTreeObserver();

가져온 ViewTreeObserve에 3가지 리스너를 등록시킬 수 있다.



   ViewTreeObserve 리스너 등록


ViewTreeObserve는 ViewTree의 높이를 구하기 좋은 2가지의 상태에 대해 리스너를 추가 시킬 수 있다.

addOnGlobalFocusChangeListener

addOnGlobalLayoutListener


위와 같이 리스너를 등록하고 지속적인 프레임의 변화를 감지하는 작업이 아닌 뷰가 생성되고 한번정도 값을 가져오는 작업이라면

반드시 리스너를 리무브 해줘 호출을 받아오지 않도록 한다.


// ViewTree의 포커스 변경이 있을 경우
imageView.getViewTreeObserver()
.addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() {
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {

//필요한 작업

//리스너 해제
imageView.getViewTreeObserver().removeOnGlobalFocusChangeListener(this);
}
});

// ViewTree의 뷰가 그려질 때마다
imageView.getViewTreeObserver()
.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {

//뷰의 생성된 후 크기와 위치 구하기
imageView.getWidth();
imageView.getHeight();
imageView.getX();
imageView.getY();


//리스너 해제
imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});




   ViewTreeObserve의 유용한 리스너


interface ViewTreeObserver.OnDrawListener 뷰를 그릴
interface ViewTreeObserver.OnGlobalFocusChangeListener 전체 뷰의 포커스가 바뀔
interface ViewTreeObserver.OnGlobalLayoutListener 전체 뷰가 그려질 때
interface ViewTreeObserver.OnPreDrawListener 뷰가 그려지기 전
interface ViewTreeObserver.OnScrollChangedListener 스크로 상태의 변경시
interface ViewTreeObserver.OnTouchModeChangeListener 터치 모드 변경시
interface ViewTreeObserver.OnWindowAttachListener 뷰의 계층구조에 붙을 때와 떨어져 나갈때
interface ViewTreeObserver.OnWindowFocusChangeListener 윈도우 포커스 변경시


출처: http://dwfox.tistory.com/30 [DWFOX]

출처: http://dwfox.tistory.com/30 [DWFOX]

반응형

'개발 > 안드로이드' 카테고리의 다른 글

WebView Session 초기화  (0) 2017.02.20
안드로이드 ContentObserver  (1) 2017.01.31
android CustomView 생성하기  (0) 2017.01.31
커스텀 뷰 만들기  (0) 2016.12.28
안드로이드 비트맵 drawable 간에 변환하기  (0) 2016.12.23

댓글