본문 바로가기
Android

[Android] 안드로이드 : 이벤트 처리 이해하기

by 꿈나무 김땡땡 2019. 12. 1.

1. 대표적인 이벤트

이벤트 설명

터치 이벤트

- 화면을 손가락으로 누를 때 발생하는 이벤트

키 이벤트

- 키패드나 하드웨어 버튼을 누를 때 발생하는 이벤트

제스처 이벤트

- 터치 이벤트 중에서 일정 패턴을 만들어 내는 이벤트

포커스

- 뷰마다 순서대로 주어지는 포커스

화면 방향 변경

- 화면의 방향이 가로/세로로 바뀜에 따라 발생하는 이벤트

 

2. 이벤트와 리스너

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

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

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

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

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

 

3. 터치 이벤트 

- boolean onTouchEvent (MotionEvent event) 또는 View.OnTouchListener : boolean onTouch (View v, MotionEvent event) 사용

- onClickListener보다 세밀한 트래킹 가능

- GestureDetector는 onTouchListener보다 세밀한 트래킹 가능

 

package org.techtown.event;

import androidx.appcompat.app.AppCompatActivity;

import android.gesture.GestureOverlayView;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    GestureDetector detector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);
        View view = findViewById(R.id.view);
        view.setOnTouchListener(new View.OnTouchListener() { // 터치 리스너
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();

                float curX = event.getX();
                float curY = event.getY();

                if (action == MotionEvent.ACTION_DOWN) {
                    println("손가락 눌렸음 : " + curX + ", " + curY);
                } else if (action == MotionEvent.ACTION_MOVE) {
                    println("손가락 움직임 : " + curX + ", " + curY);

                } else if (action == MotionEvent.ACTION_UP) {
                    println("손가락 떼졌음 : " + curX + ", " + curY);
                }

                return true;
            }
        });

        detector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                println("onDown() 호출됨");
                return true;
            }

            @Override
            public void onShowPress(MotionEvent e) {
                println("onShowPress() 호출됨");

            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                println("onSingleTapUp() 호출됨");
                return true;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                println("onScroll() 호출됨" + distanceX + "," + distanceY);
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                println("onLongPress() 호출됨");
            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                println("onFling() 호출됨" + velocityX + "," + velocityY);
                return true;
            }
        });

        View view2 = findViewById(R.id.view2);
        view2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                detector.onTouchEvent(event);
                return true;
            }
        });
    }

    public void println(String data) {
        textView.append(data + "\n");
    }
}

4. 키 이벤트 

- 키패드의 키가 눌렸을 때는 키 이벤트가 발생

- 새로 생성할 경우는 아래와 같이,

boolean onKeyDown (int keyCode, KeyEvent event) 
boolean onKeyUp (int keyCode, KeyEvent event) 

기존의 뷰에 메소드 추가할 경우에는 아래와 같이.

View.OnKeyListener : boolean onKey (View v, int keyCode, KeyEvent event) 

 

 

- 사용자가 누를 수 있는 키로는 a, b, c와 같은 알파벳이나 1, 2, 3과 같은 숫자가 있을 수 있지만 그 외에도 시스템 BACK 키나 시스템 HOME 키도 있을 수 있습니다.

화면 하단에 항상 보이는 키인데 이 키를 눌렀을 때도 이벤트를 받을 수 있는 거죠.

그 중에서도 시스템 BACK 키는 자주 사용됩니다.

이전 화면을 돌아가고 싶을 때나 현재 진행 중인 작업을 취소하고 싶은 경우가 자주 생기기 때문입니다.

이 경우에는 간단하게 onBackPressed 메소드를 재정의하면 됩니다. : void onBackPressed()

 

아니면 키 이벤트를 직접 처리할 수도 있습니다.

키 이벤트를 처리하고 싶다면 onKeyDown 메소드를 재정의하고 파라미터로 전달된 KeyEvent 객체를 참조합니다.

그러면 어떤 키가 눌렸는지 알 수 있습니다.

@Override // generate > override methods > onKeyDown 으로 생성
public boolean onKeyDown(int keyCode, KeyEvent event) { 
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Toast.makeText(this, "시스템 BACK 버튼 눌림", Toast.LENGTH_LONG).show();
            return true; // back 키 누르면 종료가 아니라 다른 event가 실행되도록 할 수 있음
        }
        return false;
}

BACK 버튼 누르면 토스트 창

 

- 키를 눌렀을 때 전달되는 대표적인 키값

키 코드 설명
KEYCODE_DPAD_LEFT - 왼쪽 화살표
KEYCODE_DPAD_RIGHT - 오른쪽 화살표
KEYCODE_DPAD_UP - 위쪽 화살표
KEYCODE_DPAD_DOWN - 아래쪽 화살표
KEYCODE_DPAD_CENTER - [중앙] 버튼
KEYCODE_CALL - [통화] 버튼
KEYCODE_ENDCALL - [통화 종료] 버튼
KEYCODE_HOME - [홈] 버튼
KEYCODE_BACK - [뒤로 가기] 버튼
KEYCODE_VOLUME_UP - [소리 크기 증가] 버튼
KEYCODE_VOLUME_DOWN - [소리 크기 감소] 버튼
KEYCODE_0 ~ KEYCODE_9 - 숫자 0부터 9까지의 키값
KEYCODE_A ~ KEYCODE_Z - 알파벳 A부터 Z까지의 키값

댓글