티스토리 뷰
[Android] ViewTreeObserver - 뷰의 위치(높이,넓이) 구하기, 레이아웃 그려지는 시점 알아내기
DWFOX 2016. 4. 11. 17:08ViewTreeObserve
뷰의 위치(높이, 넓이) 구하기, 레이아웃 그려지는 시점 알아내기
# 뷰가 그려지지 않을때 혹은 / 뷰의 높이가 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 | 윈도우 포커스 변경시 |
'Dev > Android' 카테고리의 다른 글
[Android] 이미지 라이브러리 Picasso 사용하기 ( Using the image loader library Picasso) (1) | 2016.07.26 |
---|---|
[Android Stuido] Android Studio Library Import ( 라이브러리 추가 ) 방법 (9) | 2016.06.21 |
[Android] Bitmap 회전, 좌우 / 상하 반전 적용하기 ( inverse, rotate ) (1) | 2016.03.23 |
[Android] Activity 화면 이동 애니메이션 효과 적용하기 (2) | 2016.03.04 |
[Android Studio] Android Studio OpenCV 모듈 사용하기 (0) | 2016.02.15 |
- Total
- Today
- Yesterday
- 예제
- Android Stuido
- jar
- 안드로이드 스튜디오
- 일식
- 후쿠오카
- 에러
- 컵라면
- library
- 라멘
- 돈돈
- Android Studio
- 맛집
- 설치
- 편의점
- MongoDB
- GS25
- java
- 리뷰
- Custom
- Picasso
- 일본
- 안드로이드
- Android
- 라면
- Python
- 직화
- 하카타
- 생성
- 인스턴트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |