본문 바로가기

안드로이드/코드

[안드로이드] 터치(클릭) 이벤트 감지 - GestureDetector,OnTouchListener

반응형

 

이벤트1

 

어플은 사용자의 특정 움직임을 감지해서 이벤트가 발생하도록 만드는데 손가락으로 눌렀을때, 움직였을때, 손가락을 뗐을때 등 이런 여러가지 움직임을 감지하는 대표적인 인터페이스는 GestureDetector, OnTouchListener 입니다.

GestureDetector, OnTouchListener를 이용해서 화면을 터치 했을때 어떤식으로 이벤트를 감지하는지 view 두개를 생성하고 움직임이 감지되면 어떤 움직임이 감지되는지 textview에 띄워주도록 만들어보겠습니다.

 

 

 

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <View
        android:id="@+id/view1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#C00000" />

    <View
        android:id="@+id/view2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#0427EB" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

        </LinearLayout>
    </ScrollView>
</LinearLayout>

 

2. MainActivity.java

import android.support.v7.app.AppCompatActivity;
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 = findViewById(R.id.textView);

        View view1 = findViewById(R.id.view1);
        view1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

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

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:{
                        printS("손가락 눌림 : "+curX+", "+curY);
                        return true;
                    }

                    case MotionEvent.ACTION_MOVE:{
                        printS("손가락 움직임 : "+curX+", "+curY);
                        return true;
                    }

                    case MotionEvent.ACTION_UP:{
                        printS("손가락 뗌 : "+curX + ", "+curY);
                        return false;
                    }

                    default: return false;
                }


            }
        });

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

            @Override
            public void onShowPress(MotionEvent e) {
                printS("onShowPress() 호출");
            }

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

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

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

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                printS("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 printS(String s) {
        textView.append(s+"\n");
    }
}

 

view1(빨간색) -  OnTouchListener를 이용하여 화면에 손가락이 닿았을때, 누른 상태에서 움직였을때, 손가락을 뗐을때를 감지

 

view2(파란색) -  GestureDetector를 이용하여 좀더 세부적인 움직임을 감지

 

printS(String s)함수를 만들어서 텍스트뷰에 감지된 이벤트를 띄워주도록 했습니다.

 

해당코드를 작성하고 직접 실행해보면 어떤 움직임들을 감지 할 수 있는지 더 쉽게 이해하실 수 있습니다.

 

 

반응형