티스토리 뷰
두 메소드 모두 뷰의 좌표값을 얻기 위해 종종 쓰는 메소드이다.
둘의 차이를 비교하기 전에 Android Developers 에서의 정의를 살펴보자.
public void getLoactionInWindow(int[] outLocation)
@param outLocation int : 좌표를 보유할 두 정수 배열
window 에서 view 의 좌표를 계산한다. 메소드가 리턴 된 후, 배열에는 x 밑 y 위치가 순서대로 포함된다.
public void getLocationOnScreen(int[] outLocation)
@param outLocation int : 좌표를 보유할 두 정수 배열
screen 에서 view 의 좌표를 계산한다. 메소드가 리턴 된 후, 배열에는 x 밑 y 위치가 순서대로 포함된다.
[참조] https://developer.android.com/reference/android/view/View
정의된 문서를 보면, 좌표값을 가져오는 기준이 window / screen 의 차이라는 것을 알 수 있다.
그렇다면 window 영역과 screen 영역의 다른점은 무엇일까 ?
이곳 을 보면 아래와 같이 설명하고 있다.
|--phone screen-----activity window---|
|--------status bar-------------------|
| |
| |
|-------------------------------------|
우리가 보는 휴대폰 화면은 이와같은 영역으로 구분되며,
getLocationOnScreen() 은 phone screen 을
getLocationInWindow() 는 activity window 를 기준으로 한다고 한다.
하지만 이것만 보고는 명확히 차이를 인지할수가 없었고 다른 답변을 보고 차이를 인지할 수 있었는데, 이와 같이 설명하고 있다.
일반적으로 window 의 크기는 screen 크기와 동일하기 때문에 getLocationOnScreen() 과 getLocationInWindow() 는 대부분 같은 값을 리턴한다. 그러나 때때로 window 가 screen 보다 작을 때가 있다. ( 예, dialog 나 custom system keyboard 에서 )
그렇기에 원하는 좌표가 screen 과 관계가 있다면, 대부분 activity 에서, getLocationOnScreen() 을 쓰는것이 좋고
만약 screen 보다 window 의 view 를 사용하는 경우, dialog 나 custom keyboard, getLocationInWindow() 를 사용하는 것이 적절하다.
간단한 테스트를 해보고 알맞게 사용해보자.
screen 과 window 의 크기가 동일한 activity 를 만들고
onCreate() 에서 이와같이 로그를 찍었다.
final Button btn = (Button) findViewById(R.id.dt_btn);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int[] loc = new int[2];
int[] loc1 = new int[2];
btn.getLocationInWindow(loc);
Log.e(TAG, "loc in window : " + loc[0] + ", " + loc[1]);
btn.getLocationOnScreen(loc1);
Log.e(TAG, "loc on screen : " + loc1[0] + ", " + loc1[1]);
int left = btn.getLeft();
int top = btn.getTop();
int right = btn.getRight();
int bottom = btn.getBottom();
Log.e(TAG, "btn left : " + left + ", right : " + right + ", top : " + top + ", bottom : " + bottom);
}
});
여기서 주의할 점이 onCreate() 시점에 해당 뷰의 좌표값을 얻으려 하면 0 을 리턴한다는 것이다.
뷰가 완전히 그려지기 이전에 좌표값을 구하려하기 때문이라는데 button 의 onclick event 로 값을 얻어오는 것으로 구현하여 해결하였다.
이 테스트를 진행하며 getLeft(), getRight() .. 값도 테스트 하였는데,
이 메소드들은 해당 뷰와 부모 뷰와의 관계 값을 리턴해준다.
loc in window : 520, 1248
loc on screen : 520, 1248
btn left : 520, right : 920, top : 928, bottom : 1120
결과를 보면 두 메소드 모두 같은 좌표 값을 리턴해준다.
다음 테스트로 window 와 screen 이 크기가 다른 경우를 보기 위해
button 의 크기만을 window 로 가지는 custom dialog 를 만들어 테스트 해보았다.
로그를 찍는 코드는 위와 동일하다.
loc in window : 64, 64
loc on screen : 520, 1136
btn left : 0, right : 400, top : 0, bottom : 192
두 메소드가 다른 좌표값을 리턴해주는 것을 확인할 수 있다.
getLocationOnScreen() 은 기존과 유사한 좌표값을 주지만 getLoccationInWindow() 는 생성된 custom dialog 의 window 영역 내에서 view 좌표 값을 리턴해준다.
마찬가지로, left/right/top/bottom 값도 부모 뷰의 크기 변화에 따라 값이 달라진 것을 알 수 있다.
'프로그래밍 > Android' 카테고리의 다른 글
DataBinding, Binding 객체 생성 (1) | 2021.07.11 |
---|---|
[Android] Architecture Components 사용 시의 5가지 일반적인 실수 (0) | 2019.10.20 |
[Android] Message.obtain() vs Handler.obtainMessage() (0) | 2019.10.03 |
[Android] Handler ( sendMessage, post ) / runOnUiThread (1) | 2019.10.03 |
[Android] 인터페이스 상수 (0) | 2019.08.25 |