본문 바로가기
Android/Android Basic

안드로이드 터치 이벤트(TouchEvent) 기본

by 수쓰뎁 2023. 1. 16.


1. 터치 이벤트

안드로이드에서 사용자와 상호작용을 위해 사용하는 객체는 View 클래스이다.

View 클래스는 이벤트가 발생했을 때 호출되는 몇 개의 콜백 메서드(Callback Method)를 갖고있다.

View 객체에 어떤 액션이 발생하면 콜백 메서드는 안드로이드 프레임워크에 의해 호출된다.

예를 들어 사용자가 화면을 터치하면 onKeyDwon() 메서드가 호출된다.

키 이벤트를 처리하는 가장 확실한 방법은 View클래스의 onKeyDown() 메서드를 재정의 하는 것이다.

이벤트 처리를 위해 View클래스를 상속받는 것은 실용적이지 않다.

하지만 사용자가 커스텀 컴포넌트를 작성하고자 한다면 View 클래스의 이벤트 처리 메서드를 재정의하여 사용한다.

터치 이벤트를 처리하는 대표적인 두 가지 방식은 다음과 같다.

  • View의 Callback 메서드 재정의 : 
    onTouchEvent(MotionEvent e)를 재정의
  • 리스너 등록 :
    onTouch(View v, MotionEvent e)를 재정의

커스텀 뷰 클래스의 전체적인 구조는 다음과 같다.

public class CustomView extends View {
    int x = 100;
    int y = 100;

    public CustomView(Context context) {
        super(context);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        x = (int) event.getX();
        y = (int) event.getY();
        return true;
    }
}

Callback 메서드의 onTouchEvent()를 통해 전달되는 MotionEvent 객체에는 액션 코드와 좌표가 포함된다.

액션 코드는 터치가 올라가는지 내려가는지를 나타내며, 좌표값은 터치가 발생한 좌표값을 말한다.

MotionEvent의 getAction() 메서드는 다음과 같은 터치 동작에 대한 정보를 반환한다.

  • ACTION_DOWN
    누르는 동작이 시작됨.
  • ACTION_UP
    누르고 있다가 뗄 때 발생함.
  • ACTION_MOVE
    누르는 도중에 움직임.
  • ACTION_CANCEL
    터치 동작이 취소됨.
  • ACTION_OUTSIDE
    터치가 현재의 위젯을 벗어남.

2. 커스텀 뷰 구현

안드로이드 커스텀뷰 예제를 만들어보자.

커스텀뷰 예제 테스트를 위해 다음과 같은 순서로 코드를 작성한다.

  • activity_main.xml 작성
  • MainActivity.java 작성

커스텀 뷰 구현을 위해 터치 이벤트를 View 클래스의 Callback 메서드를 재정의 하는 방법으로 알아보자.

화면의 원을 터치해서 원하는 위치로 이동하는 커스텀 뷰를 구현해보자.

  • 화면의 원을 터치하여 이동시키는 앱을 구현한다.
  • 터치 동작 정보를 화면에 텍스트로 표시한다.

 

1) MainActivity.java

레이아웃은 Hello World! 텍스트를 지우는 것 외에 딱히 변경할 필요가 없으니 바로 자바코드를 작성한다.

다음과 같이 자바코드를 작성한다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CustomView customView = new CustomView(this);
        setContentView(customView);
    }

    protected class CustomView extends View {
        int x = 100;
        int y = 1000;
        String str;

        public CustomView(Context context) {
            super(context);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            canvas.drawCircle(x, y, 100, paint);
            paint.setTextSize(50);
            canvas.drawText("액션의 종류: " + str, 0, 100, paint);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            x = (int) event.getX();
            y = (int) event.getY();

            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                str = "ACTION_DOWN";
            }
            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                str = "ACTION_MOVE";
            }
            if (event.getAction() == MotionEvent.ACTION_UP) {
                str = "ACTION_UP";
            }
            invalidate();
            return true;
        }
    }
}

새 프로젝트를 생성하면 만들어지는 MainActivity.java 안에 이너클래스인 CustomView 클래스를 작성한다.

drawCircle() 메서드를 통해 원을 그려준다.

CustomView 클래스 안에서 View 클래스의 onTouchEvent() 메서드를 재정의 한다.

사용자가 터치하면 원이 호출되고, 좌표를 x, y에 저장한다.

현재 동작 정보는 str에 저장하여 액션의 종류를 확인할 수 있도록 한다.

 

  • onTouchEvent()의 반환값
    return 값이 true로 지정되면 자신의 이벤트를 완벽하게 처리했다는 것을 의미한다.
    만약 false로 설정되면 다른 메서드가 동일한 이벤트를 다시 처리하는 것을 허용한다.
  • 이벤트 처리 메서드 재정의의 문제점
    반드시 View 클래스를 상속받아 사용해야 한다.
    즉, TextEdit와 같이 이미 정의된 위젯을 사용할 때에도 반드시 TextEdit를 상속한 클래스를 작성해야 한다.


3. 실행 결과

작성한 테스트 앱을 실행해보면 다음과 같이 구동되는 것을 확인할 수 있다.

구현하고자 했던대로 화면의 원을 터치하여 원하는 위치로 이동할 수 있으며, 동작에 따른 이벤트를 상단의 텍스트에 보여준다.

반응형

댓글