부모 뷰의 onTouchListener가 발생하지 않을 때 해결법
문제정의
quickly앱(https://github.com/seoft/quickly)개발을 하기 이전에 우선 필요 뷰들을 라이브러리화 시켜 적용할 계획이었고,
DragAndDropBetweenMultipleGrid(in https://github.com/seoft/seoft-android-libraries)라는 라이브러리 프로젝트 진행하였는데 도중에 의도치 않은 버그가 발생하였다.
버그 리포팅을 위한 요구사항은 중앙의 RecyclerView 내 아이템을 롱 클릭했을 때 플로팅 뷰 하나가 생겨나고 손가락을 따라다니며 스크린에 전체에 왔다 갔다 할 수 있게 구현하는 것
구현상황 :
1. RecyclerView ViewHolder에 setOnClickListener, setOnLongClickListener등록, 클릭 콜백 발생 시 high-order-function으로 Activity에 넘김
2. RecyclerView에 setOnTouchListener등록 롱 클릭 이벤트 발생 후 플로팅 뷰의 좌표값을 계산해서 손가락을 따라다니게 함
예상 : 롱 클릭 이벤트 발생과 동시에 온 터치 이벤트 발생
버그 : 롱 클릭 이벤트 발생 후 한번 손가락을 움직여 줘야 온터치 이벤트 발생
왜 그럴까?
참조 : https://moka.land/android/touch-event-transfer/
터치 이벤트 전달이 RecyclerView의 setOnLongClickListener에 묶여있다가 롱 클릭 이벤트가 발생된 이후에 전달이 풀리게 되어RecyclerView의 setOnTouchListener에서 터치 이벤트 전달받게 된 것
해결법:
setOnLongClickListener로 터치 이벤트를 전달하기 전에 묶여있기 전에 RecyclerView의 onTouchListener가 발생하여 setOnLongClickListener가 발생한 직후의 로직을 진행시켜야 한다.
그러기 위해서 적용시킬 View의 addOnItemTouchListener함수로 View의 OnItemTouchListener를 재구현하여 onInterceptTouchEvent함수에서 처리할 수 있게 한 뒤 넣어준다.
참조 : https://iw90.tistory.com/238