안녕하세요!
오늘은 제가 안드로이드를 개발하면서 유용한 팁 하나를 소개시켜드리고자 합니다.
안드로이드를 개발하시면서 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()를 호출할 경우에 에러가 발생하니 유의 해주세요..!)
참고
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 |