안드로이드 앱 만들기 onTouchEvent와 invalidate
android onTouchEvent 우리가 사용하는 스마트폰을 조작할 때는 99% 화면 터치로 이루어진다고 해도 과언이 아닐 것이다. 어떤 아이콘이나 버튼을 클릭하기 위해서 손가락으로 스마트폰은 터치하면 안드로이드는 터치한 곳의 좌표와 함께 화면을 단지 터치만 한 건지, 누르고 있는지, 누르고 있다가 떼는지 등 각종 움직임을 인식하게 되는데 이번 글에서는 그중 가장 기본이 되는 터치했을 때 발생하는 이벤트의 좌표를 화면에 출력하는 프로그래밍을 통해서 기본 개념들을 정리해보려고 한다.
안드로이드에서 화면 터치 이벤트를 처리하는 방법은 두 가지가 있지만 이번 글에서는 하나의 뷰에서 사용하기에 좋은 onTouchEvent를 오버라이딩 해서 사용할 것이다. onTouchListener를 등록해서 처리할 수도 있고 이 녀석이 우선순위도 높지만 하나의 화면으로 이루어진 앱에서는 적당하지 않기 때문에 View 클래스의 onTouchEvent를 오버라이딩 해서 사용한다.
예제를 만들어 보기 위해서 프로젝트를 생성한 후 VIew를 상속받은 My_Touch라는 클래스를 생성한다.
onTouchEvent를 사용하기 위해서 VIew를 상속했으며 생성자까지 만든 상태이다. 다음은 메서드를 오버라이딩 한다.
이때 매개변수로 넘어오는 event에서 여러 가지 정보를 가져올 수 있는데 이번 글에서는 이벤트가 발생한 좌표만 가져와서 출력해본다.
x, y의 좌표를 담기 위해서 변수를 선언하고 있으며 매개변수로 넘어온 event에서 getX, getY 메서드를 이용해서 좌표를 가져올 수 있는데 int 값만 구하기 위해서 캐스팅을 했으며 이제 이 x와 y에 저장된 값을 화면에 출력하기 위해서 onDraw 메서드를 이용한다.
Paint 객체를 생성해서 화면에 표시할 글자의 크기와 색을 지정하고 있으며 cnavas.drawText의 인자로 x, y 좌표와 함께 텍스트가 출력될 곳(0, 30)의 위치 그리고 글자의 크기와 색(pa)을 지정해주고 있는 모습이다. 글자의 크기를 30으로 했기 때문에 출력될 곳의 높이(Y) 또한 30으로 지정했다.
마지막으로 화면에 출력되는 MainActivity에서 앞에서 생성한 클래스를 연결해주고 앱을 실행해보자.
앱을 실행함과 동시에 좌표값이 나타나긴 하는데 각각 '0'으로 출력된 상태이고 화면을 터치해봐도 새로 발생한 이벤트의 좌표를 받아오지 못하는 문제가 발생한다. 이는 화면에 글자를 출력하고 있는 onDraw는 앱을 실행할 때와 화면을 다시 그려줘야 할 때만 실행되기 때문인데 이벤트가 생길 때마다 갱신해서 화면을 다시 그려주기 위해서 VIew 클래스의 invalidate() 메서드를 호출하면 된다.
예제처럼 onTouchEvent 안에 invalidate()를 넣어서 이벤트가 발생할 때마다 갱신을 하도록 하면 되는 것이다. 이제 앱을 다시 실행해서 화면의 여기저기를 터치해보면 그곳의 좌표가 출력되는 걸 확인할 수 있다.
이렇게 해서 안드로이드 앱 만들기 기초 중에서 게임처럼 하나의 뷰에서 발생하는 이벤트 처리를 위해서 onTouchEvent()를 활용해봤으며 화면 갱신을 위한 invalidate()까지 알아봤습니다. 수고하셨어요.