다오의 개발일지

이벤트 처리 본문

모바일/안드로이드

이벤트 처리

다오__ 2025. 2. 28. 11:10

이벤트 핸들러

- 사용자의 터치 반응이나 시스템 구성요소에서 발생되는 이벤트를 처리하는 주체

- 이벤트의 발생을 탐지, 그에 대응하는 기능을 실행시킨다.

 

View를 통한 콜백 메서드의 구현

콜백 메서드

- 특정 이벤트가 발생하면 시스템에서 '자동으로 호출'되는 메서드

- 이벤트가 발생하면 자동으로 호출되어 실행되는 콜백 메서드를 재정의한다.

- View에서 구현되며 View 클래스 내부에 존재하는 추상 메서드가 재정되어 활용됨

- 콜백 메서드는 하나의 이벤트에 대한 정보만을 가진다. (이벤트리스너는 여러 대상을 등록)

OnTouchEvent 화면 터치 시 true/false
onKeyDown 키를 누른 상태에서 뗄 때 true/false
onKeyUp 키를 눌렀을 때 true/false
onTrackballEvent 트랙볼이 사용될 때 true/false
onFocusChanged View가 포커스를 얻거나 잃을 때 true/false

여기서 파라미터에는 MotionEvent 객체인 event가 들어온다.

여기에는 사용자의 터치 이벤트가 들어있다. (펜, 손가락, 좌표 등)

event.getAction() 으로 가져올 수 있다.

  MotionEvent 객체의 getAction 메서드는 사용자의 행동에 대한 정보를 전달받는 기능을 수행한다.

if(event.getAction() == MotionEvent.ACTION_DOWN) ~

- 특정 터치 이벤트만 지정되어있기때문에 처리할 수 있는 이벤트가 제한적임

 

 

이벤트 리스너 인터페이스의 구현

- View 내에 있는 특정 이벤트를 처리하는 인터페이스

- 특정 이벤트가 발생하는 시점까지 대기하고 있다가 발생된 이벤트에 맞는 콜백 메서드를 수행한다.

- 이벤트가 제한적이지 않으므로 범용적이며, View를 상속받을 필요도 없다.

View.OnTouchListener View를 터치 할 때 호출
View.OnKeyListener 키를 누르거나 뗄 때
View.OnClickListener View를 클릭할 때
View.OnLongClickListener View를 길게 클릭할 때
View.OnFocusChangeListener 포커스가 한 View에서 다른 View로 바뀔 때
View.OnDragListener View를 드래그 할 때

 

- 이벤트를 처리할 수 있는 인터페이스를 구현하려면 "별도의 클래스를 선언 후 그에 대한 객체를 만들어 놓아야 함"

- 배보다 배꼽이 커진느낌, 리소스 및 코드가 많이 들어가는 문제

 

 

액티비티를 통한 이벤트 리스너의 구현

- 액티비티는 Activity 클래스를 이미 상속받지만 인터페이스는 개수에 상관없이 구현할 수 있다.

- 액티비티로 리스너 인터페이스를 구현하는 것이 가능하다.

//터치리스너 예제
public class MainActivity extends Activity implements View.OnTouchListener
{
 public void onCreate(){
 
 	v.setOnTouchListener(this)   //< 여기서 this 는 이 클래스, 리스너를 구현했기에 이 자체가 리스너다 
 	...
 }
 public boolean onTouch(View v, MotionEvent event) {
 	...
 }
}

 

- 하지만 액티비티를 통해 View에 대한 이벤트를 처리하기 위한 메서드를 제공하기에 View는 액티비티에 종속적이다.

- View를 다른 액티비티에 재사용 하려면 이벤트 리스너를 다른 액티비티에 또 구현해야 한다.

 

 

View를 통한 이벤트 리스너의 구현

- View 클래스를 선언하는 부분에서 필요한 이벤트리스너 인터페이스를 상속받아 구현한다.,

- 이렇게 하면 액티비티에 종속적이지 않아 재사용 면에서 유리하다

//onCreate 메서드 중
MyView vw = new MyView(this)
vw.setOnTouchListener(vw)

//터치리스너를 구현하는 MyView 클래스 정의
class MyView extends View implements View.OnTouchListener {
	public MyView(Context context){   //Activity가 들어감
    ...
    }
	public boolean onTouch(View v, MotionEvent event){
    
    ...
    }

}

 

구별할 점

View를 통한 콜백 메서드 구현에서는 onTouchEvent() 콜백 메서드를 이용하고

View를 통한 이벤트 리스너는 onTouch() 메서드를 이용한다.

 

 

이벤트 핸들러 우선순위
- 내부에 중첩된 안쪽 범위일 수록 우선순위가 높다.

일반적으로

1. View의 인터페이스 리스너

2. View의 콜백 메서드

3. 액티비티의 콜백 메서드

- 중첩된 경우, 메서드의 return값을 true로 반환하면 다음 메서드는 호출되지 않는다.

- return을 주석처리 하면 return false로 진행되면서 다음 메서드를 이어서 호출시킨다.

  다만 이전 메서드들이 빠르게 실행되기 때문에, 메시지를 출력하거나 하는 것을 중첩으로 사용하기엔 부적절하다.

 

 

 

 

터치입력

- onTouchEvent(콜백), onTouch(이벤트리스너

- 사용자가 화면을 터치하면서 발생하는 사용자 이벤트

- 사용자와의 직접적인 상호작용과 JAVA 프로그램의 동적인 기능 수행을 통해 처리도김

 

 

키보드입력

- onKeyDown : 키보드 입력 이벤트 발생 시 호출

- getKeyCode : 클릭된 키코드를 전달함

- KEYCODE_DPAD_XXX : 이동 키 관련 keyCode

- KEYCODE_A ~ Z, 0~9, ... : 문자관련 keyCode

  통화, 홈, 뒤로, 볼륨 증가 감소 등

 

invalidate : 화면을 갱신 시킨 후, onDraw메서드 자동호출

 

위젯 이벤트

 

타이머 이벤트

- 다른 이벤트와 달리 타이머는 프로그램 코드를 통해 이벤트가 실행되며, 매개 변수로 지정한 값에 따라 이벤트 발생 간격과 횟수가 결정됨

 

Handler 

- 액티비티에서 쓰레드에게 메시지를 보내는 클래스

- 쓰레드 간 메시지 통신을 위한 통로

- sendEmptyMessage(sendEmptyMessage)로 특정 핸들러에게 보낼 수 있음

- 안드로이드 플랫폼은 메인 쓰레드가 아닌 서브 쓰레드에서는 직접 사용자 인터페이스 작업을 처리할 수 없다.

  그러므로 Handler를 사용해 메시지를 보내 사용자 인터페이스 작업을 처리한다.

 

Handler 인터페이스를 사용해 구현하는데, 생성 후 바로 handleMessage 메서드를 구현해서 사용할 수 있다.

handler.sendEmptyMessageDelayed(0, 1000) : 1초 후 다시 전송

 

방향 이벤트

SensorManager 클래스

- 센서에 접근하게 해 줄 수 있는 메서드들을 제공

 

 Sensor

- SensorManager 클래스의 메서드를 활용해 접근하고자 하는 센서의 객체를 선언

 

SensorEventListener 인터페이스

- 센서값이 변경되면 SensorManager를 통해 이벤트 형태로 변경된 센서값을 전달받을 수 있게 함

 

SensorEvent 클래스

- 센서에 대한 정보를 담고 있고 객체를 통해 센서값들을 획득할 수 있음

 

 

'모바일 > 안드로이드' 카테고리의 다른 글

대화 상자  (0) 2025.03.04
어댑터 뷰  (0) 2025.03.04
도형 및 소리 출력  (0) 2025.02.27
레이아웃  (0) 2025.02.27
사용자 인터페이스를 위한 위젯  (0) 2025.02.26