본문 바로가기

Android/정보

뷰페이저(ViewPager) 관련 짜투리 지식 1 (스와이프 및 애니메이션 제거, 스와이프 속도 조절)

1. 스와이프 및 애니메이션 제거

우선 뷰페이저에 isUserInputEnabled 속성을 false로 설정하면 사용자의 스와이프 이벤트를 막을 수 있습니다.

binding.refrigeratorViewpager.run{
isUserInputEnabled= false
}

그리고 만일 뷰페이저와 탭 레이아웃을 같이 사용한다면, 탭 레이아웃에 아래와 같이 설정하면 애니메이션 또한 제거할 수 있습니다.

binding.refrigeratorTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
    override fun onTabSelected(tab: TabLayout.Tab?) {
        tab?.position?.let{binding.refrigeratorViewpager.setCurrentItem(it, false)}
}

    override fun onTabUnselected(tab: TabLayout.Tab?) {

    }

    override fun onTabReselected(tab: TabLayout.Tab?) {

    }
})

setCurrentItem 에서 두 번째 파라미터로 false를 설정하면 애니메이션을 제거합니다.

2. 뷰페이저 스와이프 속도 설정

이 경우 스와이프되는 속도를 조절하면 됩니다.

이때 ViewPager2는 상속이 안 되기 때문에, 코틀린의 확장함수를 사용합니다.

이때 duration 에 해당하는 값이 바로 속도이며, 단위는 밀리세컨드입니다.

fun ViewPager2.setCurrentItemWithSpeed(
    item: Int,
    duration: Long,
    interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(),
    pagePxWidth: Int =width,
    pagePxHeight : Int =height
) {
    val pxToDrag : Int = if (orientation== ViewPager2.ORIENTATION_HORIZONTAL) {
        pagePxWidth * (item - currentItem)
    } else {
        pagePxHeight * (item - currentItem)
    }
    val animator = ValueAnimator.ofInt(0, pxToDrag)
    var previousValue  = 0
    animator.addUpdateListener{valueAnimator->
val currentValue = valueAnimator.animatedValueas Int
        val currentPxToDrag = (currentValue - previousValue).toFloat()
        fakeDragBy(-currentPxToDrag)
        previousValue = currentValue
}
animator.addListener(object : Animator.AnimatorListener {
        override fun onAnimationStart(p0: Animator?) {
            beginFakeDrag()
        }
        override fun onAnimationEnd(p0: Animator?) {
            endFakeDrag()
        }
        override fun onAnimationCancel(p0: Animator?) {
        }

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

이후 아래와 같이 사용하면 됩니다

binding.onBoard3Viewpager.setCurrentItemWithSpeed(++viewpagerIndex, 550)

 

728x90
반응형