ViewPager2 - addOnPageChangeListener

TRASALBY·2023년 4월 11일
0

Android

목록 보기
5/10

뷰페이저의 변화를 감지

viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        // Called when the scroll state changes (starting, stopping, or changing position)
    }

    override fun onPageSelected(position: Int) {
        // Called when a new page has been selected
    }

    override fun onPageScrollStateChanged(state: Int) {
        // Called when the page is scrolled
    }
})

뷰페이저를 사용하면서 currentItem을 변경하거나 화면을 스크롤 하는 것으로 다른 아이템으로 이동하는 경우에 사용할 수 있는 리스너이다. registerOnPageCHangeCallback을 통해 뷰페이저에 할당할 수 있다.

onPagsScrolled

사용자가 화면을 스크롤하거나 프로그래밍을통해 아이템이 변경되었을 때 호출된다. 스크롤이 진행되는동안 계속되서 호출된다.
3개의 매개변수 값을 가지고 있다.
positon : 현재 선택된 페이지의 인덱스
positionOffset: ViewPager2 너비의 일부로 해당 위치에서 현재 페이지의 오프셋.
positionOffsetPixels: 해당 위치에서 현재 페이지의 오프셋.

onPageSelected

뷰페이저에서 새로운 페이지로 도착했을때 호출된다.
도착한 위치의 position을 매개변수로 가지고 있어 해당 값을 사용해 현재 선택된 아이템을 바탕으로 UI를 갱신하는 등의 작업을 수행할 수 있다.

onPageScrollStateChange

뷰페이저가 스크롤 될때 상태의 변화를 감지하여 호출된다. state값을 통해 상태에 따른 처리를 진행할 수 있다.
ViewPager2.SCROLL_STATE_IDLE : 기본값, 스크롤이 없는 상태이다.
ViewPager2.SCROLL_STATE_DRAGGING : 사용자가 드래그를 통해 화면을 스크롤 하고 있는 상태이다.
ViewPager2.SCROLL_STATE_SETTLING : 사용자가 손가락을 떼어 한화면에 정착한 상태이다. 손가락을 떼었을 때 현재 위치와 속도 등을 기반으로 가까운 페이지로 이동하는 애니메이션이 동작한다.

사용자의 스크롤인지, 프로그래밍을 통한 이동인지 확인하기.

onPageScrollStateChange사용

var isUserScrolling = false
override fun onPageScrollStateChanged(state: Int) {
	super.onPageScrollStateChanged(state)
    if(state == ViewPager2.SCROLL_STATE_DRAGGING){
    	isUserScrolling = true
    } else if(state == ViewPager2.SCROLL_STATE_IDLE){
    	if(isUserScrolling){
    		// 사용자가 스크롤한 상태이다.
        }
        isUserScrolling = false
	}
}

사용자가 아이템을 스크롤 했다면 state의 값으로 ViewPager2.SCROLL_STATE_DRAGGING가 들어오게된다. 이를 감지하여 isUserScrolling의 값을 true로 저장한다.
이후 하나의 아이템으로 정착하고 화면이동이 멈추었다면 ViewPager2.SCROLL_STATE_IDLE값이 들어오게 된다. 이때 이전에 저장해 두었던 isUserScrolling의 값을 확인한다면 해당 이동이 사용자에 의한 것인지, 프로그래밍에 의한 것인지를 알 수 있다.
작업을 수행한 후에는 isUserScrolling의 값을 false로 초기화 하여 이후 동작에 문제가 없도록 한다.

0개의 댓글