ViewPager2 - 滑块过渡滑动得太快
ViewPager2 - Slider transition sliding too fast
我已经根据 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
}
}
}
}
}
现在,在我的 activity 中,我用处理程序包装了这个动画以自动滑动,但速度非常快,我什至在滑动时都没有注意到
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)
}
我已经调整了处理程序的延迟,但这不是问题所在,因为那只是在它要切换到另一个页面时延迟,但是这个切换过程中的转换非常快,我怎样才能减慢它?
我在使用 ViewPager2 时遇到了类似的问题。我的 ViewPager 中有两个项目,并将切换到下一个项目作为按钮的动作。第一次按下它时,动画是瞬时的,就像你描述的那样。但是,在我的设置中,如果您再次按下它,它会向左滚动。一旦这样做,动画就会正常工作(左右)。
从你的代码中我可以看出,在你的情况下你继续在一个方向上滚动 - 因此你只观察到瞬时滚动。试着玩弄它并让它向后滚动,而不仅仅是向前滚动。看看动画在那种情况下是否正确显示。
编辑:如果您发现同样的行为也适用于您的情况,您可以应用一个完全不雅的 hack:
您可以在打开 activity 时尽快 "browse" 浏览 ViewPager 的项目。然后,在完成每个项目后,切换回第一个项目,然后应用您现在拥有的任何逻辑。如果您这样做,项目将已经 "loaded" 并且动画将起作用。
当然,当您在 "background" 中这样做时,您可以在第一次进入 activity 时显示一个进度加载器,一旦您滚动回到第一个项,显示你的 activity。用户会认为 activity 是 "loading",但实际上您将浏览 ViewPager 的每个项目,实际上 "pre-loading" 它们。
完全丑陋的解决方案,但它应该有效。我希望有人能想出比这更好的,因为我不知道动画第一次播放不正确的原因。
我已经根据 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
}
}
}
}
}
现在,在我的 activity 中,我用处理程序包装了这个动画以自动滑动,但速度非常快,我什至在滑动时都没有注意到
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)
}
我已经调整了处理程序的延迟,但这不是问题所在,因为那只是在它要切换到另一个页面时延迟,但是这个切换过程中的转换非常快,我怎样才能减慢它?
我在使用 ViewPager2 时遇到了类似的问题。我的 ViewPager 中有两个项目,并将切换到下一个项目作为按钮的动作。第一次按下它时,动画是瞬时的,就像你描述的那样。但是,在我的设置中,如果您再次按下它,它会向左滚动。一旦这样做,动画就会正常工作(左右)。
从你的代码中我可以看出,在你的情况下你继续在一个方向上滚动 - 因此你只观察到瞬时滚动。试着玩弄它并让它向后滚动,而不仅仅是向前滚动。看看动画在那种情况下是否正确显示。
编辑:如果您发现同样的行为也适用于您的情况,您可以应用一个完全不雅的 hack:
您可以在打开 activity 时尽快 "browse" 浏览 ViewPager 的项目。然后,在完成每个项目后,切换回第一个项目,然后应用您现在拥有的任何逻辑。如果您这样做,项目将已经 "loaded" 并且动画将起作用。
当然,当您在 "background" 中这样做时,您可以在第一次进入 activity 时显示一个进度加载器,一旦您滚动回到第一个项,显示你的 activity。用户会认为 activity 是 "loading",但实际上您将浏览 ViewPager 的每个项目,实际上 "pre-loading" 它们。
完全丑陋的解决方案,但它应该有效。我希望有人能想出比这更好的,因为我不知道动画第一次播放不正确的原因。