스크롤 상단 이동
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이면 아래로 스크롤 한것이다. (스크롤 위치가 아님!!)
- 스크롤이 끝났을 때 호출
- 스크롤 될 때마다 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 |