[안드로이드 / Kotlin] ViewPager2 setCurrentItem duration

2022. 10. 28. 13:06·Android
반응형

안녕하세요!

오늘은 제가 안드로이드를 개발하면서 유용한 팁 하나를 소개시켜드리고자 합니다.

안드로이드를 개발하시면서 ViewPager2를 많이들 사용하고 계실거라는 생각이 듭니다.

ViewPager2에서 특정한 위치의 페이지로 이동할 때, setCurrentItem(item: Int, smoothSroll: Boolean)을 이용합니다.

이때 두번째 파라미터인 smoothScroll을 true로 하게되면 마치 직접 스크롤하듯이 페이지가 전환됩니다. 

그런데 해당 애니메이션의 속도가 생각보다 너무 빠르게 흘러가 속도를 조절하고자 서칭해본 결과..

ViewPager2에서 해당 기능을 따로 제공하지 않고 있었습니다..😢

 

그래서 오늘 소개시켜드릴 내용이 바로 duration 조절이 가능한 커스텀 setCurrentItem() 입니다.

거두절미하고 코드는 아래와 같습니다🫡

fun ViewPager2.setCurrentItemWithDuration(
    item: Int,	
    duration: Long,
    interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(),
    pagePxWidth: Int = widht	// ViewPager2.getWidth()
) {
    val pxToDrag: Int = pagePxWidth * (item - currentItem)
    val animator = ValueAnimator.ofInt(0, pxToDrag)
    var previousValue = 0
    
    animator.addUpdateListener { valueAnimator ->
    	val currentValue = valueAnimator.animatedValue as Int
        val currentPxToDrag = (currentValue - previousValue).toFloat()
        fakeDragBy(-currentPxToDrag)
    }
    
    animator.addListener(object : Animator:AnimatorListener {
    	
        override fun onAnimationStart(animation: Animator?) { 
        	beginFakeDrag()
        }
        
        override fun onAnimationEnd(animation: Animator?) {
        	endFakeDrag()
        }
        
        override fun onAnimationCancel(animation: Animator?) {}

        override fun onAnimationRepeat(animation: Animator?) {}
    })
    
    animator.interpolator = interpolator
    animator.duration = duration
    animator.start()
}

핵심은 ViewPager2의 fakeDrag와 ValueAnimator를 이용해 마치 직접 스크롤하는 효과를 주는 것입니다.

이 기능을 보통 배너에서 ViewPager2를 사용해 auto scroll 구현할 때 많이들 사용하실거라고 생각합니다.

Utills 같은 클래스에 해당 함수를 구현해놓으면 duration 파라미터 변경만으로 편리하게 사용하실 수 있습니다😁

현재 이 코드는 안드로이드 31 버전까지 정상적으로 동작하는 것을 확인했습니다!!

(fakeDrag가 이뤄지는 동안에 실제 setCurrentItem()를 호출할 경우에 에러가 발생하니 유의 해주세요..!)

 

 

참고

https://stackoverflow.com/questions/57505875/change-viewpager2-scroll-speed-when-sliding-programmatically

 

Change ViewPager2 Scroll Speed when sliding programmatically

I know there is way to change animation duration of ViewPager programmatical slide (here). But its not working on ViewPager2 I tried this: try { final Field scrollerField = ViewPager2.c...

stackoverflow.com

 

반응형

'Android' 카테고리의 다른 글

[안드로이드 / Kotlin] Snackbar에 커스텀 폰트 적용하기  (0) 2022.11.08
[안드로이드] ConstraintLayout 뷰 밀림 문제  (0) 2022.10.30
[안드로이드 / Kotlin] Moshi  (2) 2022.09.30
[안드로이드 / Kotlin] Clean Architecture 개념  (0) 2022.09.18
[안드로이드 / Kotlin] 소스코드 수정 없이 debug/release 앱 분리하기  (0) 2022.05.29
'Android' 카테고리의 다른 글
  • [안드로이드 / Kotlin] Snackbar에 커스텀 폰트 적용하기
  • [안드로이드] ConstraintLayout 뷰 밀림 문제
  • [안드로이드 / Kotlin] Moshi
  • [안드로이드 / Kotlin] Clean Architecture 개념
서주냥
서주냥
간단한 것도 기록하는 습관을 가지자
  • 서주냥
    DroidLog
    서주냥
  • 전체
    오늘
    어제
    • 전체보기 (58)
      • 알고리즘 (12)
        • 백준 (4)
        • 프로그래머스 (5)
        • 개념 (3)
      • Android (43)
        • Compose (1)
      • Java (2)
      • Kotlin (1)
  • 링크

    • GitHub
  • 인기 글

  • 태그

    다이나믹 프로그래밍
    SnackBar
    안드로이드
    이진 탐색
    ConstraintLayout
    Coroutine Flow
    reified
    Coroutine
    백준
    뷰모델
    FusedLocationProviderClient
    moshi
    viewpager2
    viewmodel
    투 포인터
    코틀린
    코루틴
    BLE
    프로그래머스
    Clean Architecture
    벨만 포드
    자바
    클린 아키텍처
    최단 경로
    Hilt
    textunit
    블루투스
    알고리즘
    debounce
    RecyclerView
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
서주냥
[안드로이드 / Kotlin] ViewPager2 setCurrentItem duration
상단으로

티스토리툴바