Change ViewPager animation duration when sliding programmatically

前端 未结 7 1114
清酒与你
清酒与你 2020-11-28 20:45

I\'m changing slide with the following code:

viewPager.setCurrentItem(index++, true);

But it changes too fast. Is there a way to set manual

7条回答
  •  独厮守ぢ
    2020-11-28 21:01

    I used Cicero Moura's version to make a Kotlin class that still works perfectly as of Android 10.

    import android.content.Context
    import android.util.AttributeSet
    import android.view.MotionEvent
    import android.view.animation.DecelerateInterpolator
    import android.widget.Scroller
    import androidx.viewpager.widget.ViewPager
    
    class CustomViewPager(context: Context, attrs: AttributeSet) :
            ViewPager(context, attrs) {
    
    
        private companion object {
            const val DEFAULT_SPEED = 1000
        }
    
        init {
            setScrollerSpeed(DEFAULT_SPEED)
        }
    
        var scrollDuration = DEFAULT_SPEED
            set(millis) {
                setScrollerSpeed(millis)
            }
    
        private fun setScrollerSpeed(millis: Int) {
            try {
                ViewPager::class.java.getDeclaredField("mScroller")
                        .apply {
                            isAccessible = true
                            set(this@CustomViewPager, OwnScroller(millis))
                        }
    
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    
        inner class OwnScroller(private val durationScrollMillis: Int) : Scroller(context, AccelerateDecelerateInterpolator()) {
            override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
                super.startScroll(startX, startY, dx, dy, durationScrollMillis)
            }
        }
    }
    

    Initializing from the activity class:

    viewPager.apply {
        scrollDuration = 2000
        adapter = pagerAdapter
    }
    

提交回复
热议问题