【问题标题】:ViewPager2 - Slider transition sliding too fastViewPager2 - 滑块过渡滑动太快
【发布时间】:2019-12-30 21:31:58
【问题描述】:

我已经从viewpager2的文档中实现了跟随动画

private const val MIN_SCALE = 0.85f
private const val MIN_ALPHA = 0.5f

class ZoomOutPageTransformer : ViewPager2.PageTransformer {

    override fun transformPage(view: View, position: Float) {
        view.apply {
            val pageWidth = width
            val pageHeight = height
            when {
                position < -1 -> { // [-Infinity,-1)
                    // This page is way off-screen to the left.
                    alpha = 0f
                }
                position <= 1 -> { // [-1,1]
                    // Modify the default slide transition to shrink the page as well
                    val scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position))
                    val vertMargin = pageHeight * (1 - scaleFactor) / 2
                    val horzMargin = pageWidth * (1 - scaleFactor) / 2
                    translationX = if (position < 0) {
                        horzMargin - vertMargin / 2
                    } else {
                        horzMargin + vertMargin / 2
                    }

                    // Scale the page down (between MIN_SCALE and 1)
                    scaleX = scaleFactor
                    scaleY = scaleFactor

                    // Fade the page relative to its size.
                    alpha = (MIN_ALPHA +
                            (((scaleFactor - MIN_SCALE) / (1 - MIN_SCALE)) * (1 - MIN_ALPHA)))
                }
                else -> { // (1,+Infinity]
                    // This page is way off-screen to the right.
                    alpha = 0f
                }
            }
        }
    }
}

现在,在我的活动中,我用 Handler 包装了这个动画以自动滑动,但速度非常快,我什至无法注意到它的滑动

private fun slideViewPager(){
    var currentPage = 0
    var timer: Timer? = null
    val DELAY_MS: Long = 2000 //delay in milliseconds before task is to be executed
    val PERIOD_MS: Long = 3000
        val handler = Handler()
        val update = Runnable {
            if (currentPage == NUM_PAGES - 1) {
                currentPage = 0
            }
            viewPager.setCurrentItem(currentPage++, true)
        }

        timer = Timer() // This will create a new Thread
        timer!!.schedule(object : TimerTask() { // task to be scheduled
            override fun run() {
                handler.post(update)
            }
        }, DELAY_MS, PERIOD_MS)
    }

我已经调整了处理程序的延迟,但这不是问题,因为它只是在它要切换到另一个页面时延迟,但是在这个变化期间的转换非常快,我怎样才能减慢它?

【问题讨论】:

  • 请尝试将position &lt;= 1更改为position &lt;= 10或更高时
  • 什么也没发生。
  • 您的延迟是否增加了几秒钟?
  • 我已经更改了处理程序的延迟秒数,但处理程序只处理 viewpager,而不处理过渡动画,处理程序只会等到 x 秒才能更改

标签: android kotlin android-viewpager android-viewpager2


【解决方案1】:

我在使用 ViewPager2 时遇到了类似的问题。我的 ViewPager 中有两个项目,并将切换到下一个项目作为按钮的操作。第一次按下它,动画是瞬间的,就像你描述的那样。但是,在我的设置中,如果您再次按下它,它会向左滚动。一旦这样做,动画就可以正常工作(左右)。

根据我从您的代码中可以看出,在您的情况下,您会继续沿单个方向滚动 - 因此您只能观察到瞬时滚动。尝试使用它并使其向后滚动,而不仅仅是向前滚动。看看在这种情况下动画是否正确显示。

编辑:如果您发现同样的行为也适用于您的情况,您可以应用完全不雅的技巧:

您可以在打开活动时尽快“浏览” ViewPager 的项目。然后,在完成每个项目之后,切换回第一个项目,然后应用你现在拥有的任何逻辑。如果您这样做,项目将已经“加载”并且动画将起作用。

当然,当您在“后台”执行此操作时,您可以在第一次进入活动时显示进度加载器,一旦您滚动回第一项,显示您的活动。用户会认为 Activity 正在“加载”,但实际上您将浏览 ViewPager 的每个项目,有效地“预加载”它们。

完全丑陋的解决方案,但它应该工作。我希望有人能想出比这更好的,因为我不完全知道动画第一次播放不正确的原因。

【讨论】:

  • 感谢您的回答,我认为过渡动画应该延迟在动画类中,而不是在处理程序中
  • 您是否尝试过回滚到 ViewPager 已经浏览过的项目?动画应该可以工作。
  • 动画从两边工作,向后滑动或通过viewpager,问题是它做得非常快
  • 在我的例子中,如果您在 ViewPager 上滑动,动画会起作用,但如果您以编程方式进行,则它不会起作用。但是,一旦您滚动浏览这些项目,如果您在 ViewPager 上滑动以及按下挂钩以编程方式滑动 ViewPager 的按钮,动画都会起作用。
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多