본문 바로가기

Android/지식저장소

[Android] RecyclerView 에서 엣지 스크롤 이펙트 숨기기

맨 끝에 있는 요소에서 스크롤 시 발생하는 이펙트

 

리사이클러뷰의 맨 첫번째 또는 마지막 요소에서 스크롤(오버스크롤)할 경우 발생하는 이펙트를 숨겨야하는 요구사항이 있었다.

그래서 검색해보면, 대부분 리사이클러뷰에 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 를 리턴하라고 되어있다.