5_Android_(터치, 제스처, 키이벤트)

mobile/android · 2020. 5. 5. 16:39

터치이벤트처리

package org.techtown.sampleevent;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import static java.sql.DriverManager.println;

public class MainActivity extends AppCompatActivity {


    TextView textView;

    // 2. 제스처 이벤트 처리를 위한 제스처 객체선언
    GestureDetector detector;

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

        textView = findViewById(R.id.textView);

        View view = findViewById(R.id.view);

        // 1. 온터치리스너 등록(온터치 리스너 생성 -> onTouch가 자동으로 호출)
        view.setOnTouchListener(new View.OnTouchListener() {
            // MotionEvent (액션정보와 터치한 곳의 좌표 등이 담겨있음)
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // 모션이벤트에서 액션정보를 담아 int action으로 참조함(정수값)
                int action = event.getAction();

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

                if(action == event.ACTION_DOWN) {
                    println("손가락 눌림 : " + curX + "," + curY);
                } else if (action == event.ACTION_MOVE) {
                    println("손가락 움직임 : " + curX + "," + curY);
                } else if (action == event.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) {
                // view2를 터치했을때 발생하는 터치 이벤트를 제스처 디렉터로 전달
                detector.onTouchEvent(event);
                return true;
            }
        });
    }

    // textView에 보여주는 함수
    public void println(String data) {
        textView.append(data + "\n");
    }

    // 3. 키이벤트 처리(KEYCODE_BACK)
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if(keyCode == event.KEYCODE_BACK) {
            Toast.makeText(this,
                    "시스템 [BACK] 버튼이 눌렸습니다", Toast.LENGTH_LONG).show();

            return true;
        }
        return false;
    }


}