본격적인 예제에 들어가기 전에, 절대 좌표(absolute coordinates)가 무엇인지 먼저 이해할 필요가 있습니다. 절대 좌표란 윈도우 매니저(Window Manager) 기준으로 특정 뷰(View)가 화면상에 위치한 절대적인 (x, y) 좌표를 의미합니다. 즉, 부모 뷰나 다른 컨테이너의 위치에 영향을 받지 않고 화면 전체를 기준으로 한 실제 위치 값입니다.
이번 예제에서는 안드로이드에서 뷰의 절대 좌표를 가져오는 방법을 단계별로 알아보겠습니다.
1단계: 새 프로젝트 생성
Android Studio를 실행하고 File → New Project 메뉴로 이동한 후, 새 프로젝트 생성에 필요한 모든 세부 정보를 입력하여 프로젝트를 만듭니다.
2단계: 레이아웃 XML 작성
res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.
<?xml version = "1.0" encoding = "utf-8"?> <RelativeLayout xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" android:padding = "16dp" tools:context = ".MainActivity" android:background = "#dde4dd"> <TextView android:id = "@+id/text" android:layout_marginLeft = "100dp" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "Hello World!" /> </RelativeLayout>
위 XML 코드에는 하나의 TextView가 포함되어 있습니다. 사용자가 이 TextView를 클릭하면 해당 뷰의 화면상 위치가 Toast 메시지로 표시됩니다.
3단계: MainActivity 자바 코드 작성
src/MainActivity.java 파일에 아래 코드를 추가합니다.
package com.example.andy.myapplication;
import android.graphics.Point;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.TextureView;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int[] location = new int[2];
textView.getLocationOnScreen(location);
Toast.makeText(MainActivity.this,"X axis is "+location[0] +"and Y axis is "+location[1],Toast.LENGTH_LONG).show();
}
});
}
public static Point getLocationOnScreen(View view) {
int[] location = new int[2];
view.getLocationOnScreen(location);
return new Point(location[0], location[1]);
}
}코드 설명
위 코드의 핵심은 getLocationOnScreen() 메서드입니다. 이 메서드는 길이가 2인 정수 배열을 매개변수로 받아, 인덱스 0에 X축 좌표를, 인덱스 1에 Y축 좌표를 저장합니다. 사용자가 TextView를 클릭하면 클릭 리스너가 실행되어 해당 뷰의 화면 기준 절대 좌표를 계산하고, 그 결과를 Toast로 화면에 표시합니다.
또한 재사용성을 고려해 뷰를 전달받아 Point 객체 형태로 좌표를 반환하는 정적 유틸리티 메서드 getLocationOnScreen(View view)도 함께 정의했습니다.
애플리케이션 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. Android Studio에서 앱을 실행하려면 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바에서 Run 아이콘을 클릭합니다. 실행 옵션 목록에서 실제 안드로이드 모바일 기기를 선택하세요. 그러면 모바일 기기에 아래와 같은 초기 화면이 표시됩니다.

초기 화면 상태에서 사용자가 TextView를 클릭하면, 아래와 같이 해당 뷰의 절대 좌표(X축, Y축 값)가 Toast 메시지로 나타납니다.

마무리
이처럼 getLocationOnScreen() 메서드를 활용하면 뷰의 화면 기준 절대 좌표를 손쉽게 얻을 수 있습니다. 이 기법은 드래그 앤 드롭 구현, 팝업 위치 지정, 애니메이션 시작점 계산 등 뷰의 실제 화면 위치가 필요한 다양한 상황에서 유용하게 활용됩니다.