터치 이벤트와 키 이벤트
버튼을 클릭했을 때는 클릭 이벤트가 발생합니다.
클릭 이벤트를 처리하는 싶다면 OnClickListener라는 인터페이스를 구현하는 객체를 만든 후 버튼에 등록하면 됩니다.
그런데 버튼을 클릭하는 경우는 워낙 많아서 좀 더 쉽게 클릭 이벤트를 처리할 수 있도록 onClick 속성을 추가로 제공해주고 있습니다.
즉, XML 레이아웃에서 onClick 속성의 값으로 메소드의 이름을 넣어주고 그 메소드를 소스 코드에 추가하면 버튼을 클릭했을 때 이 메소드가 호출됩니다.
뷰 클래스를 상속한 상태에서 터치 이벤트를 다룰 때는 onTouchEvent 메소드를 재정의하고 키이벤트를 다룰 때는 onKeyDown이나 onKeyUp 메소드를 재정의합니다.
boolean onTouchEvent (MotionEvent event)
boolean onKeyDown (int keyCode, KeyEvent event)
boolean onKeyUp (int keyCode, KeyEvent event)
만약 이미 만들어져 있는 뷰 객체의 터치 이벤트나 키 이벤트를 다루고 싶다면 OnTouchListener나 OnKeyListener를 설정하면 됩니다.
View.OnTouchListener : boolean onTouch (View v, MotionEvent event)
View.OnKeyListener : boolean onKey (View v, int keyCode, KeyEvent event)
클릭 이벤트는 터치 이벤트를 단순화한 것인데요, 터치 이벤트는 손가락으로 터치했을 때 생기는 각각의 상태를 다룰 수 있도록 해 줍니다.
손가락을 누른 상태, 손가락을 누르고 움직이는 상태, 손가락을 뗀 상태를 각각 이벤트로 전달합니다.
터치 이벤트 처리하기
뷰 객체에 OnTouchListener를 설정하고 싶다면 setOnTouchListener 메소드를 사용합니다.
OnTouchListener 안에는 onTouch 메소드를 정의할 수 있는데 뷰가 터치되었을 때 이 메소드가 자동으로 호출됩니다.
파라미터로는 MotionEvent 객체가 전달되죠.
MotionEvent 객체에는 터치된 곳의 좌표와 함께 터치된 상태가 전달됩니다.
손가락이 눌렸는지, 눌린 상태에서 움직였는지, 아니면 손가락이 떼어졌는지를 구분할 수 있는 정보를 받을 수 있는데 getAction 메소드를 이용해 확인할 수 있습니다.
터치 이벤트를 처리하는 기본적인 코드는 다음과 같습니다.
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
if (action == MotionEvent.ACTION_DOWN) {
println("손가락 눌림.");
} else if (action == MotionEvent.ACTION_MOVE) {
println("손가락 움직임.");
} else if (action == MotionEvent.ACTION_UP) {
println("손가락 뗌.");
}
return true;
}
});
키 이벤트 처리하기
키패드의 키가 눌렸을 때는 키 이벤트가 발생합니다.
사용자가 누를 수 있는 키로는 a, b, c와 같은 알파벳이나 1, 2, 3과 같은 숫자가 있을 수 있지만 그 외에도 시스템 BACK 키나 시스템 HOME 키도 있을 수 있습니다.
화면 하단에 항상 보이는 키인데 이 키를 눌렀을 때도 이벤트를 받을 수 있는 거죠.
그 중에서도 시스템 BACK 키는 자주 사용됩니다.
이전 화면을 돌아가고 싶을 때나 현재 진행 중인 작업을 취소하고 싶은 경우가 자주 생기기 때문입니다.
이 경우에는 간단하게 onBackPressed 메소드를 재정의하면 됩니다.
void onBackPressed()
아니면 키 이벤트를 직접 처리할 수도 있습니다.
키 이벤트를 처리하고 싶다면 onKeyDown 메소드를 재정의하고 파라미터로 전달된 KeyEvent 객체를 참조합니다.
그러면 어떤 키가 눌렸는지 알 수 있습니다.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, "시스템 [BACK] 버튼이 눌렸습니다.", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
최근댓글