티스토리 뷰

728x90
반응형

getLocationOnScreen vs getLocationInWindow()

두 메소드 모두 뷰의 좌표값을 얻기 위해 종종 쓰는 메소드이다.

둘의 차이를 비교하기 전에 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() {
           @Override
           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 값도 부모 뷰의 크기 변화에 따라 값이 달라진 것을 알 수 있다.

위 내용을 토대로 Window 와 Screen 의 차이를 이해하고 상황에 맞는 메소드를 쓰도록 해보자


반응형
공지사항
최근에 올라온 글