[Android] Android의 onTouchListener에서 Drag를 구현하였을 때 생긴 오류

onDragListener가 아닌 onTouchListener를 이용해서 드래그를 구현할 때 생겼던 문제점이 있어서 기억해두고자 포스팅한다.


배경

안드로이드 프로젝트를 작게 진행하고 있는데 onTouchListener에서 ACTION_UP에 관련된 코드를 작성하였지만 작동하지 않은 사례가 있어서 기억하고자 포스팅한다.


코드 상황

아래와 같은 코드로 처음에 제작을 하였으며 onTouch안에다가 함수가 실행되고 Action Value가 어떤것인지 알 수 있도록 로그 코드를 작성하였으며 각 Action Value에 따라서도 case문을 타고 들어갔음을 알기위해 로그 코드를 작성하였습니다.

imageView_Lv1alarmClockCancel.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                Log.e("onTouchTest", "onTouch Entered");

                int action = motionEvent.getAction();

                Log.e("onTouchTest", "Action Value: " + action);
                switch (action) {

                    case MotionEvent.ACTION_DOWN:
                        Log.e("onTouchTest", "ACTION_DOWN");
                        // ...Dragging View Codes
                        break;

                    case MotionEvent.ACTION_UP:
                        Log.e("onTouchTest", "ACTION_UP");
                        // ...
                        break;

                    default:
                        break;
                }
                return true;

            }

        });


결과는 아래와 같습니다. 화면을 터치하는 순간 ACTION_DOWN(Action Value = 0)이 되면서 case문을 타고 가지만 드래그를 시행하고 모든 작업을 마쳤을 때 화면에서 손을 떼었을 때 ACTION_UP이 아닌 ACTION_CANCEL(Action Value = 3)이 들어오는 것을 확인 할 수 있습니다.

즉, onTouch의 함수에서는 화면을 터치했는지 안했는지만을 확인하며 그에 대한 값들만 ACTION 값으로 받아옴을 확인 할 수 있습니다.

03-09 20:01:31.198 7117-7117/com.unopenlab.iamalarm E/onTouchTest: onTouch Entered
03-09 20:01:31.198 7117-7117/com.unopenlab.iamalarm E/onTouchTest: Action Value: 0
03-09 20:01:31.198 7117-7117/com.unopenlab.iamalarm E/onTouchTest: ACTION_DOWN
03-09 20:01:31.241 7117-7117/com.unopenlab.iamalarm E/onTouchTest: onTouch Entered
03-09 20:01:31.242 7117-7117/com.unopenlab.iamalarm E/onTouchTest: Action Value: 3


참고자료