Kotlin/TIL

TIL (04.17)

내손은개발 🐾 2024. 4. 17. 21:36

 

 

스크롤 상단 이동

    private fun scrollEvent() {
        val btnUp = binding.btnUp
        val fadeIn = AlphaAnimation(0f,1f).apply { duration = 300 } //[1]
        val fadeOut = AlphaAnimation(1f,0f).apply { duration = 300 } //[2]

        //스크롤 이벤트 감지
        binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { //[3]
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { //[4]
                super.onScrollStateChanged(recyclerView, newState)
                if (newState == RecyclerView.SCROLL_STATE_IDLE) { //[5]
                    if (!recyclerView.canScrollVertically(-1)) { //[6]
                        btnUp.startAnimation(fadeOut) //[7]
                        btnUp.visibility = View.GONE //[8]
                    } else { //최상단이 아닐 경우
                        btnUp.startAnimation(fadeIn) //[9]
                        btnUp.visibility = View.VISIBLE //[10]
                    }
                }
            }
        })
        btnUp.setOnClickListener {
            binding.recyclerView.smoothScrollToPosition(0) //[11]
        }
    }

 

[1] [2]

AlphaAnimation은 투명도를 조절하는 함수이다.

public AlphaAnimation(float fromAlpha, float toAlpha) {
        throw new RuntimeException("Stub!");
    }

[투명] 0.0 ~ 1.0 [불투명]사이의 값을 갖는다.

fromAlpha : 시작 투명도

toAlpha : 종료 투명도

 

[3]

OnScrollListener : RecyclerView에 OnScrollListener를 추가해서 onScrolled와 onScrollStateChanged를 오버라이드해서 현재 스크롤 상태를 체크할 수 있다.

  • onScrolled vs onScrollStateChanged
    • 간단 정리 : 스크롤이 되는 중일때 호출
    • dx, dy 변수는 각자 수직/수평으로 스크롤이 얼마나 되었는지 그 양을 뜻한다.
    • 현재 위치를 0으로 기준잡고 dy<0 이면 위로 스크롤, dy >0이면 아래로 스크롤 한것이다. (스크롤 위치가 아님!!)
    onScrollStateChanged
    • 스크롤이 끝났을 때 호출
    • 스크롤 될 때마다 onScrolled를 호출해서 반응성 좋게 만들 수 있지만, 빈번한 호출로 앱이 버벅일 수도 있다.
    • 스크롤 상태(newState)의 변수 종류
      • SCROLL_STATE_SETTLING → 위/아래 스크롤이 끝까지 간 상태
      • SCROLL_STATE_IDLE → 현재 스크롤을 하지 않은 상태
      • SCROLL_STATE_DRAGGING → 스크롤을 하고 있는 상태
  • onScrolled

[4]

RecyclerView의 스크롤 상태가 변경될 때 호출

 

[5]

스크롤 상태가 정지일 때 실행

 

[6]

최상단에 경우 -1 / 최하단일 경우 1

 

[7] [9]

animation 적용([1][2]번에서 설정한 투명하게 보이는)

 

[8] [10]

조건문([6])으로 최상단일 경우 / 아닐경우로 나눠서 버튼이 보이게 안보이게 설정

 

[11]

버튼에 클릭리스너를 설정해서 최상단으로 올린다.

종류

  • scrollToPosition(0) : 첫 번째 항목으로 바로 이동
  • smoothScrollToPosition(0) : 첫 번째 항목으로 부드럽게 스크롤
  • scrollToPositionWithOffset(0) : 첫 번째 항목으로 스크롤하면서 지정된 추가 오프셋을 적용하여 스크롤 위치를 조정
  • smoothScrollBy(x,y) : 현재 스크롤 위치에서 지정된 양만큼 부드럽게 스크롤

(최하단일경우 -1)

'Kotlin > TIL' 카테고리의 다른 글

TIL (04.22)  (0) 2024.04.22
TIL(04.18)  (1) 2024.04.18
TIL (04.16)  (0) 2024.04.16
TIL (04.15)  (0) 2024.04.15
TIL (04.12)  (0) 2024.04.12