[Android] 08. 사용자 이벤트 처리하기
사용자 이벤트 처리
목차
- 08-1. 터치와 키 이벤트
- 08-2. 뷰 이벤트
- [실습] 시계 앱의 스톱워치 기능 만들기
08-1. 터치와 키 이벤트
✅ 터치 이벤트
- 터치 이벤트의 콜백 함수인 onTouchEvent()를 선언한다.
- 매개변수는 MotionEvent 객체이며, 이 객체에 터치의 종류와 발생 지점(좌푯값)이 담긴다.
- 터치 이벤트의 종류
- ACTION_DOWN: 화면을 손가락으로 누른 순간의 이벤트
- ACTION_UP: 화면에서 손가락을 떼는 순간의 이벤트
- ACTION_MOVE: 화면을 손가락으로 누른 채로 이동하는 순간의 이벤트
- 터치 이벤트 발생 좌표 얻기
- onTouchEvent() 함수의 매개변수인 MotionEvent 객체로 획득
- x: 이벤트가 발생한 뷰의 X좌표
- y: 이벤트가 발생한 뷰의 Y좌표
- rawX: 화면의 X좌표
- rawY: 화면의 Y좌표
✅ 키 이벤트
- 사용자가 폰의 키를 누르는 순간에 발생한다.
- 콜백 함수
- onKeyDown: 키를 누른 순간의 이벤트
- onKeyUp: 키를 떼는 순간의 이벤트
- onKeyLongPress: 키를 오래 누르는 순간의 이벤트
- 첫 번째 매개변수는 키의 코드이며 이 값으로 사용자가 어떤 키를 눌렀는지 식별
- 키 이벤트가 발생하는 키는 폰에서 제공하는 소프트 키보드의 키를 의미하지 않는다.
- 안드로이드 시스템 버튼도 키로 취급하므로 이 버튼의 이벤트를 처리한다.
- 뒤로가기 버튼 이벤트에는 앞에서 살펴본 onKeyDown()이나 onKeyUp()함수를 이용할 수도 있지만 onBackPressed()함수를 이용할 수도 있습니다.
- 제스처 내비게이션을 사용하고 있다면 사용자 제스처로 뒤로 가기를 하면 <뒤로가기>버튼을 누른 것과 같다. 그러므로 사용자 제스처 뒤로가기도 onKeyDown()함수를 선언해 이벤트 처리가 가능하다.
- 뒤로가기 버튼 이벤트에는 onBackPressed() 함수를 이용할 수도 있다.
- API Level 33에서 뒤로가기 버튼 이벤트 처리 함수인 onBackPressed()함수는 deprecated 되었다.
- androidx.activity.OnBackPressedCallBack()함수 이용을 권장한다.
08-2. 뷰 이벤트
✅ 뷰 이벤트의 처리 구조
- 뷰 이벤트 처리는 이벤트 소스와 이벤트 핸들러로 역할이 나뉘며 이 둘을 리스너로 연결해야 이벤트를 처리할 수 있다.
- 이벤트 소스: 이벤트가 발생한 객체
- 이벤트 핸들러: 이벤트 발생 시 실행할 로직이 구현된 객체
- 리스너: 이벤트 소스와 이벤트 핸들러를 연결해 주는 함수
- 체크박스 이벤트 처리
- 액티비티에서 인터패이스를 구현한 예
- 이벤트 핸들러를 별도의 클래스로 만든 예
- SAM 기법으로 구현한 예
✅ 클릭과 롱클릭 이벤트 처리
- ClickEvent, LongClickEvent는 뷰의 최상위 클래스인 View에 정의된 이벤트
- open fun setOnClickListener(l: View.OnClickListener?): Unit
- open fun setOnLongClickListener(l: View.OnLongClickListener?): Unit
[실습] 시계 앱의 스톱워치 기능 만들기
| 1단계: 새 모듈 생성하기
- Ch8_Event라는 이름으로 새로운 모듈을 만듭니다.
| 2단계: 그래들 설정하기
| 3단계: 둥근 버튼 만들기
- [res] → [drawable] 디렉터리를 마우스 오른쪽 버튼으로 눌러 [New] → [Drawable Resource File] 메뉴를 선택
- round_button.xml 파일
| 4단계: 앱 화면 구성하기
- activity_main.xml 파일
| 5단계: 메인 액티비티 작성하기
- MainActivity.kt 파일
| 6단계: 앱 실행하기
[추가] 안드로이드 용어 설명
| 터치 좌표(x, y vs rawX, rawY)의 결정적 차이점 설명
이 두 가지를 언제 구분해서 써야 할까?- x, y (뷰 기준 좌표): 이벤트가 발생한 특정 버튼이나 이미지 뷰 내부에서의 좌표입니다. 예를 들어, 게임 화면 내에서 캐릭터를 미세하게 조작할 때 사용합니다.
- rawX, rawY (전체 화면 기준 좌표): 폰 화면의 절대적인 좌측 상단(0, 0)을 기준으로 한 좌표입니다. 뷰를 화면 안에서 자유롭게 드래그 앤 드롭으로 이동시킬 때나, 전체 화면 제스처를 감지할 때 주로 쓰인다는 실무 팁입니다.
| API 레벨 33(Android 13) 이상에서 뒤로가기 처리가 바뀐 이유
왜 바뀌었는지 이유와 대체 코드에 대해서 알아봅시다.
- 바뀐 이유 (예측형 제스처): 안드로이드 13부터 도입된 '예측형 뒤로 가기 제스처(Predictive Back Gesture)' 때문입니다. 사용자가 화면 가장자리를 쓸어 넘길 때, 홈 화면으로 나갈지 이전 화면으로 갈지 미리 시각적으로 보여주는 기능입니다. 기존
onBackPressed()는 이 제스처가 끝나기 전에 강제로 실행되어 애니메이션을 방해하기 때문에 구글에서 사용을 중단시켰습니다.
- 대체할 최신 권장 코드 (OnBackPressedCallback):
| 뷰 이벤트 처리 시 '람다식'을 사용한 가독성 개선 팁
자바 방식의 리스너 구현과 코틀린의 람다(Lambda) 표현식을 비교하여 알아봅시다.
- 기존 방식:
setOnClickListener(object : View.OnClickListener { ... })처럼 코드가 길어지고 가독성이 떨어지는 문제가 있습니다.
- 코틀린 람다 방식: 인터페이스에 메서드가 하나만 있을 때(SAM 변환) 코틀린에서는 단 한 줄로 줄일 수 있음을 보여줍니다:
| 안드로이드 13(API 33) 이상 개발 시 필수 주의사항!
기존에 뒤로가기 버튼 이벤트를 처리할 때 흔히 사용하던 onBackPressed() 함수가 API Level 33부터 Deprecated(생성 중단) 되었습니다.
구글이 이 함수를 더 이상 쓰지 않기로 한 이유는 바로 '예측형 뒤로 가기 제스처(Predictive Back)' 기능 때문입니다. 사용자가 화면을 슬라이드하여 뒤로 가려고 할 때, 시스템이 미리 이전 화면을 살짝 보여주는 부드러운 애니메이션을 제공해야 하는데, 기존 함수는 이 흐름을 깨뜨리는 고질적인 문제가 있었습니다.
따라서 최신 안드로이드 개발에서는 OnBackPressedDispatcher와 OnBackPressedCallback을 사용하는 것이 구글의 공식 권장 사항입니다. 아래와 같이 캘백 객체를 등록하여 사용하면 안전하게 최신 제스처 시스템과 호환되는 앱을 개발할 수 있습니다.
댓글
댓글 쓰기