[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 기법으로 구현한 예

  • 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)' 기능 때문입니다. 사용자가 화면을 슬라이드하여 뒤로 가려고 할 때, 시스템이 미리 이전 화면을 살짝 보여주는 부드러운 애니메이션을 제공해야 하는데, 기존 함수는 이 흐름을 깨뜨리는 고질적인 문제가 있었습니다.

    따라서 최신 안드로이드 개발에서는 OnBackPressedDispatcherOnBackPressedCallback을 사용하는 것이 구글의 공식 권장 사항입니다. 아래와 같이 캘백 객체를 등록하여 사용하면 안전하게 최신 제스처 시스템과 호환되는 앱을 개발할 수 있습니다.



[07 뷰를 배치하는 레이아웃] 👈 | 👉 [09 리소스 활용하기]


댓글

이 블로그의 인기 게시물

[컴퓨터] iptime 관리자계정 찾기 및 설정

[주식] 레버리지 ETF/ETN 사전교육 이수방법 및 등록

[컴퓨터] HP노트북 USB 부팅 (Drive 포함)