반응형

이벤트와 리스너

버튼을 클릭하면 이벤트라는 것이 만들어집니다.

이벤트는 화면의 어느 부분에 어떻게 클릭하거나 터치했는지에 대한 정보를 담고 있게 됩니다.

이 이벤트는 필요에 따라 사용할 수 있도록 리스너로 전달됩니다.

따라서 버튼에 리스너를 등록해두면 버튼이 클릭 될 때마다 리스너의 메소드가 자동으로 호출되게 됩니다.

이벤트 종류는 터치 이벤트, 클릭 이벤트, 키 이벤트 등 다양합니다.

터치 이벤트와 키 이벤트

버튼을 클릭했을 때는 클릭 이벤트가 발생합니다.

클릭 이벤트를 처리하는 싶다면 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;
}

Q.한 손가락으로 터치했을 때와 두 손가락으로 터치했을 때 소스 코드에서 구분하는 방법이 있을까요?

A.구글링 해본 결과 onTouchEvent에 전달되는 MotionEvent 객체에서 getPointerCount() 메소드를 이용하여 이 값이 2개 이상이면 멀티터치인 것으로 구분할 수 있었습니다.

(터치 이벤트 확인하실 때 개발자 옵션에서 터치, 포인터 위치표시 기능을 켜놓으시면 편리합니다!)


Q.단말의 방향이 세로 방향이었다가 가로 방향으로 바뀌었을 때 어떤 일이 벌어질까요?

A.wrap_content나 크기를 고정시킨 뷰들은 동일한 크기로 나오나 match_parent로 지정된 뷰들은 세로/가로 화면에 맞추어 보여질 것 같습니다.



Q.어떤 경우에는 화면이 사라졌다가 다시 나타나는 것 같고 어떤 경우에는 똑같은 화면이 보이는 것 같은데 

어떤 경우에 화면이 그대로 유지되는 걸까요?

A.앱이 화면에서 완전히 벗어나게 되면 다시 그리고, 그렇지 않은 경우는 유지합니다.


Q.화면이 없어졌다가 새로 만들어진다면 데이터는 유지되는 걸까요?

A.다시 만들어질 때 뷰 내부에 데이터를 선언했다면 사라질 것이고 뷰 밖에 데이터를 선언했다면 유지될 것 같습니다. ( 뷰는 화면을 다시 그리게 되면 사라지므로)

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기