본문 바로가기
안드로이드 자바

[Java][Android] 터치 제스처 감지 (Gesture Detector)

by teamnova 2021. 11. 29.
728x90

터치 이벤트에 이어 이번에는

 

터치 제스처에 대해 알아보겠습니다.

 

안드로이드는 사용자의 제스처를 쉽게 구분하기 위해 GestureDetector 인터페이스가 있습니다.

 

- onDown (터치)

 

- onShowPress (onDown 보다 길게 터치)

 

- onSingleTapUp (터치가 끝날 때)

 

- onLongPress (onShowPress보다 길게 터치)

 

- onScroll(스크롤)

 

- onFling (스크롤과 비슷하지만 손가락으로 튕길 때)

 

다음과 같은 종료가 있습니다.

 

그럼 한번 알아볼까요?

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="2">
    
    <View
        android:id="@+id/view2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#FF9800" />

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <!--무슨 제스쳐를 했는지 설명하기 위한 TextView-->
        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFFFFFFF" />
    </ScrollView>
</LinearLayout>

윗 영역은 제스처를 할 영역이고

 

아래 부분은 어떤 제스처인지 출력해주는 영역입니다.

 

 

 

MainActivity.java

package com.example.touchevent;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    //객체 선언
    View view1, view2;
    ScrollView scrollView1;
    TextView textView1;
    GestureDetector detector; //무슨 제스쳐를 했는지 감지

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

        //객체 초기화
        view2 = findViewById(R.id.view2);
        scrollView1 = findViewById(R.id.scrollView1);
        textView1 = findViewById(R.id.textView1);

        view2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                detector.onTouchEvent(event);
                return true;
            }
        });
        detector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
            //화면이 눌렸을 때
            @Override
            public boolean onDown(MotionEvent e) {
                printString("onDown() 호출됨");
                return true;
            }

            //화면이 눌렸다 떼어지는 경우
            @Override
            public void onShowPress(MotionEvent e) {
                printString("onShowPress() 호출됨");
            }

            //화면이 한 손가락으로 눌렸다 떼어지는 경우
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                printString("onSingleTapUp() 호출됨");
                return true;
            }

            //화면이 눌린채 일정한 속도와 방향으로 움직였다 떼어지는 경우
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                printString("onScroll() 호출됨 => " + distanceX + ", " + distanceY);
                return false;
            }

            //화면을 손가락으로 오랫동안 눌렀을 경우
            @Override
            public void onLongPress(MotionEvent e) {
                printString("onLongPress() 호출됨");
            }

            //화면이 눌린채 손가락이 가속해서 움직였다 떼어지는 경우
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                printString("onFling() 호출됨 => " + velocityX + ", " + velocityY);
                return true;
            }
        });
    }

    private void printString(String s) {
        //좌표 출력
        textView1.append(s + "\n"); //한 줄씩 추가

        //자동으로 마지막 줄로 스크롤 내림
        scrollView1.fullScroll(View.FOCUS_DOWN);
    }

    //키가 눌렸을때 작동
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            printString("시스템에서 [Back] 버튼이 눌림");
            return true;
        } else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            printString("시스템에서 [VOLUME UP] 버튼이 눌림");
            return true;
        } else if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            printString("시스템에서 [VOLUME DOWN] 버튼이 눌림");
            return true;
        } else if(keyCode == KeyEvent.KEYCODE_ENTER) {
            printString("시스템에서 [Enter] 키가 눌림");
            return true;
        }
        return false;
    }
}

 

자 그럼 인제 결과를 확인해 볼까요?