JLOG

[안드로이드 스튜디오 강좌 #15] 이벤트 처리 이해하기 - 제스처 이벤트 처리하기 / 키이벤트처리하기 본문

안드로이드 스튜디오/Do it 안드로이드 스튜디오

[안드로이드 스튜디오 강좌 #15] 이벤트 처리 이해하기 - 제스처 이벤트 처리하기 / 키이벤트처리하기

정정선선 2020. 5. 16. 07:18

이전 강의에 이어서 진행합니다.

[안드로이드 스튜디오 강좌 #15] 이벤트 처리 이해하기 - 이벤트 처리 방식 / 터치 이벤트

 

! 목표

눌림, 움직임, 뗌, 드래그 등을 처리하는 제스처 이벤트와 키를 눌렀을 때 발생하는 키 이벤트에 대해서 알아보자.

 

 

 

1. 제스처 이벤트 처리하기

제스처 이벤트는 터치 이벤트 중 스크롤 등을 구별한 후 알려주는 이벤트이다.

 

GestureDetector로 제스쳐 이벤트를 처리해줄 수 있고, 이 객체에 터치 이벤트를 전달하면 각 사황에 맞는 메서드를 호출한다.

 

아래의 추가된 코드를 입력해보자

 

MainActivity.java

package org.techtowm.sampleevent;

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

import androidx.appcompat.app.AppCompatActivity;

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 view = findViewById(R.id.view);
        view.setOnTouchListener(new View.OnTouchListener(){
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int action = motionEvent.getAction();

                float curX = motionEvent.getX();
                float curY = motionEvent.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() {
            public boolean onDown(MotionEvent motionEvent) {
                println("onDown() 호출됨");
                return true;
            }
            public void onShowPress(MotionEvent motionEvent) {
                println("onSHowPress() 호출됨");
            }
            public boolean onSingleTapUp(MotionEvent motionEvent) {
                println("onSingleTapUp() 호출됨");
                return true;
            }
            public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1){
                println("onScroll() 호출됨 : "+v+", "+v1);
                return true;
            }
            public void onLongPress(MotionEvent motionEvent) {
                println("onLongPress() 호출됨");
            }
            public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1){
                println("onFling() 호출됨 : " +v+", "+v1);
                return true;
            }
        });

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

        view2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent motionEvent) {
                detector.onTouchEvent(motionEvent);
                return true;
            }
        });
				//추가 코드 여기까지
    }

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




    })
}

 

두번째 뷰에서 onTouchListener 객체를 설정하고 있다.

두 번째 뷰 객체를 터치했을 때 자동으로 onTouch() 메서드가 호출되고 해당 GestrueDetector 객체의 onTouchEvent() 메서드를 호출하면서 MotionEvent 객체를 전달한다.

 

-onDown() : 화면을 눌렀을 경우

-onShowPress() :화면이 눌렸다 떼어지는 경우

-onSingleTapUp() : 화면이 한손가락으로 눌렀다 떼어지는 경우

-onScroll() : 화면이 눌린채 일정한 속도와 방향으로 움직였다 떼는 경우

-onFling() : 화면이 눌릴 채 가속도를 붙여 손가락을 움직였다 떼느 경우

-onLongPress() : 화면을 손가락으로 오래 누르는 경우

 

 

실행해보면,

각 모션 이벤트를 받아 해당 이벤트에 대한 호출 결과를 맨 밑의 뷰에 나타내지는 것을 확인할 수 있다.

 

 

 

 

 

2. 키 이벤트 처리하기

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

-KEYCODE_DPAD_LEFT : 왼쪽 화살표

-KEYCODE_DPAD_RIGHT : 오른쪽 화살표

-KEYCODE_DPAD_UP : 위쪽 화살표

-KEYCODE_DPAD_DOWN : 아래쪽 화살표

-KEYCODE_DPAD_CENTER : [중앙] 버튼

-KEYCODE_CALL : [통화] 버튼

-KEYCODE_ENDCALL : [통화 종료] 버튼

-KEYCODE_BACK : [뒤로 가기] 버튼

-KEYCODE_VOLUME_UP : [소리 크기 증가] 버튼

-KEYCODE_VOLUME_DOWN : [소리 크기 감소] 버튼

-KEYCODE_0 ~ KEYCODE_9 : 숫자 0부터 9까지의 키 값

-KEYCODE_A ~ KEYCODE_Z : 알파벳 A부터 Z까지의 키 값

 

 

관련 클래스

boolean onKeyDown (int KeyCode, KeyEvent event)
boolean onKey (View v, int KeyCode, KeyEvent event)

 

-onKeyDown()

키 입력은 onKeyDown() 메서드를 정의하여 처리한다.

onKeyDown으로 전달되는 파라미터는 두개이며,

KeyCode는 어떤 키가 사용되는지 구별할 때 사용한다

KeyEvent는 키 입력 이벤트에 대한 정보를 알고 싶을 때 사용한다.

 

-onKey()

onKey() 메서드는 OnKeyListener 인터페이스를 구현할 때 사용한다.

다음의 표는 key-Code 정수 값으로 구분할 수 있는 대표적인 키 값들이다.

 

*참고

시스템 [Back] 키가 눌렸을 때는 void onBackPressed() 메서드로 간단하게 처리가능하다.

 

-MainActivity.java

MainActivity.java 파일에서 MainActivity 클래스를 클릭 후

마우스 우클릭-Generate-Override Methods 메뉴를 선택하고

onKeyDown() 메서드 선택후 OK 를 누르자

 

 

만들어진 onKeyDown 메서드 안에 안에 코드 내용을 입력하자.

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            Toast.makeText(this, "시스템 [Back] 버튼이 눌렸습니다.",
                    Toast.LENGTH_LONG).show();
            
            return true;
        }
        return false;
    }

뒤로가기 버튼이 누르면 "시스템 [Back] 버튼이 눌렸습니다."라는 내용의 토스트 메세지가 출력될 것이다.

 

 

실행 시켜보면 메세지가 출력되는 것을 볼 수있다.

 

 

 

 

## 이 글은 Do it 안드로이드 앱 프로그래밍을 참고해서 작성되었습니다.

도서에는 더 자세하고 알기 쉽게 설명이 되어 있어 도서를 참고하면서 공부하는 것을 추천드립니다.

도서 정보 : http://www.yes24.com/Product/Goods/15789466

 

Do it! 안드로이드 앱 프로그래밍

안드로이드 분야 1위 도서, 개정 2판으로 돌아오다! (롤리팝, 안드로이드 스튜디오)안드로이드 분야에서 큰 사랑을 받아온 [Do it! 안드로이드 앱 프로그래밍]의 두 번째 전면 개정판이 나왔다. 최신 롤리팝 버전을 적용한 이번 개정 2판은 지난 젤리빈 개정판보다 더 개정폭이 커졌다. 특히 2014년 12월 발표된 안드로이드 공식 개발 도구인 ‘안드...

www.yes24.com

유투브 강의 : https://www.youtube.com/watch?v=nN4xnEcnjE8

Comments