리사이클러뷰의 맨 첫번째 또는 마지막 요소에서 스크롤(오버스크롤)할 경우 발생하는 이펙트를 숨겨야하는 요구사항이 있었다.
그래서 검색해보면, 대부분 리사이클러뷰에 android:overScrollMode="never" 속성을 적용하면 해결할 수 있다고 나와있다. 실제로 이 속성만 추가해주면 해당 이펙트는 사라진다.
하지만 이 속성을 적용할 경우 오버스크롤 모드가 비활성화 되기 때문에, 오버스크롤이 필요한 경우에는 적용하면 안되는 방법이다. 그래서 오버스크롤 모드가 필요한 경우에 아래와 같은 방법으로 해주면 된다. (이것저것 해보다가 발견한 것이고, 잘 알려진 방법이 아니기때문에 다른 사이드이펙트가 발생할 수 있으니 주의!!)
recyclerView.edgeEffectFactory = object : RecyclerView.EdgeEffectFactory() {
override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
return object : EdgeEffect(view.context) {
override fun draw(canvas: Canvas?): Boolean {
return false
}
}
}
}
리사이클러뷰에 기본적으로 적용된 egeEffect 를 수정해주는 방법이다. super.draw 에서는 무언갈 그려주는 작업이 있는데(아마도 이펙트를 그리는 부분인것 같은 킹리적갓심) 그 부분을 모두 빼버리고 리턴값을 false 로 바꿔버린 것이다.
리사이클러뷰 내부에서 draw() 메서드 의 리턴값이 어떻게 활용되고있는지는 잘 모르겠지만, 주석을 보면 애니메이션을 위해 drawing 작업이 프레임을 넘어서 계속되어야할 경우 true 를 리턴하라고 되어있다.
'Android > 지식저장소' 카테고리의 다른 글
[Android] 간단한 그리기 및 지우기 with S-Pen (1) | 2021.05.14 |
---|---|
[Android] ConstraintLayout Helper - Group (0) | 2021.01.11 |
[Android] 점선 그리기(Dotted line) (0) | 2021.01.04 |
[Android] BaseSavedState 를 이용하여 View 에 상태 저장하기 (0) | 2020.09.15 |
[Android] RxJava2 + Retrofit2 에서 언제 call 이 cancel 되는가 고찰 (0) | 2020.09.10 |