티스토리 뷰

Android 에서는 이런저런 이유로 view의 위치값을 필요로 한다.
그래서 있는것이 view.getLeft(), view.getRight(), view.getTop(), view.getBottom() 이다.(좌,우,상,하)
하지만 이것은 상위Layout에서 해당 view가 위치하는 값이므로 상대값이지 절대값이 아니다.
또한 터치나 제스처에서는 X , Y 값을 받지만 이것또한 절대값이 아니다.
이벤트에서 rawX, rawY 를 구할 수도있지만,  항상 절대값은 아니다.

1. 함수이용

View.getGlobalVisibleRect(Rect) 을 이용해서 좌표를 구해올수있다.

Global이라고해도 스크린상의 절대좌표는 아니고. 해당 RootView 레이아웃을 기준으로한 좌표다.


2. 직접계산

그래서 view.getRootView() 와 view.getParentView() 를 이용하여 수동으로 절대값X,Y를 구할 수 있다.
아래 코드는 오래전 작성해놓은것이지만....

  public void toViewRawXY(View view){
  View parentView = view.getRootView();
  int sumX = 0;
  int sumY = 0;
  
  boolean chk = false;
  while (!chk) {
   sumX = sumX + view.getLeft();
   sumY = sumY + view.getTop();
   
   
   view = (View) view.getParent();
   if(parentView == view){
    chk = true;
   }
  }
  android.util.Log.d("","rawX : "+sumX);
  android.util.Log.d("","rawY : "+sumY);
 }


3. 솔찍히 위에 방법 다 필요없고 더 정확하다 이거하나면 된다. 1,2번은 쓰지말기를.
View.getLocatioinOnScreen(int[]);
이러면 뷰가 스크린상 위치하는 좌표를 알 수 있다. TouchEvent에서 들어온 x,y 좌표들과 동일한 체계가 된다.
그래서 예를 들어 TouchEvent 해당 View안에서 일어났는지 알기위해서는 이런코드면된다.

public boolean chkTouchInside(View view, int x, int y) {

 int[] location = new int[2];

 view.getLocationOnScreen(location);

 if (x >= location[0]) {

  if (x <= location[0] + view.getWidth()) {

   if (y >= location[1]) {

    if (y <= location[1] + view.getHeight()) {

     return true;

    }

   }

  }

 }

 return false;

}







[작성자] devbible.tistory.com

댓글