[Android] ViewPager.addOnPageChangeListener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
loopViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageSelected(position: Int) {
loopViewPager.currentItem = position
}
override fun onPageScrolled(position: Int, positionOffset: Float,
positionOffsetPixels: Int) {
  }
override fun onPageScrollStateChanged(state: Int) {
if (state == RecyclerView.SCROLL_STATE_DRAGGING) {
// 수동으로 스크롤 시에만 터치했을 때
} else if (state == RecyclerView.SCROLL_STATE_SETTLING){
// 스크롤이 움직인 후 픽스되는 순간
} else if (state == RecyclerView.SCROLL_STATE_IDLE) {
// 아무것도 수행하지 않을 때
// (즉, 스크롤이 움직이지 않고, 스크롤을 수동으로 잡고 있지 않음.)
}
}
})

onPageSelected

  • 페이지 인덱스가 변경되지 않는다면 이 메소드는 호출되지 않는다. (수동으로 스크롤 하다가 뗐을 때 재현가능)
  • position: 스크롤 시 선택된 페이지의 인덱스

onPageScrolled

  • 사용자의 터치 스크롤 & smooth 스크롤 시에 호출된다.
  • position: 링크에 따르면, “SETTLE 상태에서는 대상 페이지가 넘어오고, DRAGGING 상태에서는 출발 페이지가 넘어온다”고 한다. 따라서 이를 활용하기는 어려울 것 같아 사용하지 않음.
  • positionOffset: 0.0 ~ 1 사이의 값. 왼쪽으로 스크롤 시 1 -> 0.0으로 감소하며, 오른쪽으로 스크롤 시 0.0 -> 1로 증가한다.

onPageScrollStateChanged

  • 페이지 인덱스가 변경될 경우, 변경되지 않을 경우 포함
  • 상태가 변경될 경우 한 번씩 호출된다.

이벤트 전달 순서

  • 수동으로 스크롤 시 페이지를 변경했을 때 순서 SCROLL_STATE_DRAGGING -> SCROLL_STATE_SETTLING -> onPageSelected SCROLL_STATE_IDLE
  • loopViewPager.setCurrentItem으로 스크롤될 경우 순서 SCROLL_STATE_SETTLING -> onPageSelected -> SCROLL_STATE_IDLE
  • 수동으로 스크롤 시 페이지를 변경하지 않았을 경우 순서 SCROLL_STATE_DRAGGING -> SCROLL_STATE_SETTLING -> SCROLL_STATE_IDLE
Author

LEEJS

Posted on

2022-02-11

Updated on

2022-06-15

Licensed under

댓글