본문 바로가기
코딩일기/android studio

안드로이드 독학 11일차 : 터치 이벤트(Touch Event)

by 욱파이어니어 2021. 3. 24.
728x90
반응형

오늘 알아볼 것은 터치 이벤트이다.

 

터치 이벤트에는 3가지 종류가 있다. 

1. myView.setOnTouchListener(무명객체) - onTouch()

2. MyView extends View - onTouchEvent()

3. TouchEvent extends Activity - onTouchEvent()

 

이렇게 3가지가 있는데 

각각 설명하자면 

1번과 2번은 View 안에서의 터치가 일어났을때 호출되는 메서드이고 

3번은 Activity에서 터치가 일어났을때 호출되는 메서드이다.

 

그래서 따라서 View를 터치하게 되면 

 

myView.setOnTouchListener(무명 객체) - onTouch()

MyView extends View - onTouchEvent()

TouchEvent extends Activity - onTouchEvent()

 

이순으로 호출이 된다.

 

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TouchEventHandleProcess te = new TouchEventHandleProcess(this);
        te.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.d("Listener","리스너에서 호출한것");
                return false;
            }
        });
        setContentView(te);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {        if(event.getAction() == MotionEvent.ACTION_DOWN){
        Log.d("Activity", "Activity에서 처리");
        return false;
    }
        return true;
    }
}
public class TouchEventHandleProcess extends View {
    public TouchEventHandleProcess(Context context) {
        super(context);
    }

    public TouchEventHandleProcess(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            Log.d("extends View", "extends View에서 처리");
            return false;
        }
        return true;
    }
}

위 두 소스를 가지고 직접 호출을 해보면 아래와 같은 결과를 받아 볼 수 있다.

 

위의 자바 소스를 보면 모든 터치 이벤트 함수는 반환 값이 boolean 값인것을 알수가 있다.

반환 값이 false 이면 해당 이벤트가 완전히 처리 되지 않다고 판단되어 다음 단계의 터치이벤트로가서 이벤트를 기다리는것이다. 

반면에 반환값이 true이면 해당 이벤트가 완전히 처리되었다고 생각되어 다음단계의 터치 이벤트까지 내려가지 않고 

해당 이벤트를 완료 처리한다.

 

위의 예제를 통해서 보자면 extends View에서 return true 시켜서 이벤트를 완료 처리를 하게 되면 다음 Activity에서의 터치 이벤트로 넘어가지 않는다.

위 사진을 보면 계속 누르고 있을 때 Activity로 넘어가지 않는다. 하지만 extends View 부분에서 return true이기 때문에 

다른 이벤트를 감지할 수 있게 되어 터치에서 떼게 되면 

처럼 터치에서 떼 진 이벤트를 감지해 리스너를 다시 호출하게 된 것이다.

 

뭐 말이 어려울 수 있는데 true면 해당 이벤트를 끝내고 다른 이벤트를 감지할 수 있고

false면 눌려지는것을 제외한 다른 이벤트를 감지하지 못한다.

 

그렇다면 터치 이벤트에서 감지할수 있는 이벤트들은 무엇이 있을지 알아보자.

 

감지할수 있는 액션은 크게 5가지가 있다.

 

1. ACTION_DOWN : 누르는 동작이 시작되는 것

2. ACTION_UP : 누르고 있다가 뗄 때

3. ACTION_MOVE : 누르는 도중에 움직임

4. ACTION_CANCEL : 터치 동작이 취소됨

5. ACTION_OUTSIDE : 터치가 현재의 위젯을 벗어남

 

이렇게가 있다.

반응형