seoft

부모 뷰의 onTouchListener가 발생하지 않을 때 해결법 본문

android

부모 뷰의 onTouchListener가 발생하지 않을 때 해결법

seoft 2020. 1. 7. 23:13

문제정의

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

 

 

 

Comments