gpt4 book ai didi

android - 以编程方式滑动时更改 ViewPager2 滚动速度

转载 作者:行者123 更新时间:2023-12-02 12:07:34 25 4
gpt4 key购买 nike

我知道有办法更改 ViewPager 编程幻灯片 ( here ) 的动画持续时间。

但它不适用于ViewPager2

我尝试过这个:

try {
final Field scrollerField = ViewPager2.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);
final ResizeViewPagerScroller scroller = new ResizeViewPagerScroller(getContext());
scrollerField.set(mViewPager, scroller);
} catch (Exception e) {
e.printStackTrace();
}

IDE 向我发出有关“mScroller”的警告:

Cannot resolve field 'mScroller'

如果我们运行此代码,那将无法工作并给出以下错误:

No field mScroller in class Landroidx/viewpager2/widget/ViewPager2; (declaration of 'androidx.viewpager2.widget.ViewPager2' appears in /data/app/{packagename}-RWJhF9Gydojax8zFyFwFXg==/base.apk)

那么我们如何实现这个功能呢?

最佳答案

基于this issue ticket Android 团队不打算支持 ViewPager2 的此类行为,票证中建议使用 ViewPager2.fakeDragBy() 。此方法的缺点是您必须提供以像素为单位的页面宽度,但如果您的页面宽度与 ViewPager 的宽度相同,则可以使用该值。

这是示例实现

fun ViewPager2.setCurrentItem(
item: Int,
duration: Long,
interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(),
pagePxWidth: Int = width // Default value taken from getWidth() from ViewPager2 view
) {
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)
previousValue = currentValue
}
animator.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) { beginFakeDrag() }
override fun onAnimationEnd(animation: Animator?) { endFakeDrag() }
override fun onAnimationCancel(animation: Animator?) { /* Ignored */ }
override fun onAnimationRepeat(animation: Animator?) { /* Ignored */ }
})
animator.interpolator = interpolator
animator.duration = duration
animator.start()
}
<小时/>

支持RTL您必须翻转提供给 ViewPager2.fakeDragBy() 的值,所以从上面的例子中代替 fakeDragBy(-currentPxToDrag)使用fakeDragBy(currentPxToDrag)当使用RTL时.

使用此功能时需要记住的几件事,基于 official docs :

  • 负值向前滚动,正值向后滚动(用 RTL 翻转)

  • 在调用 fakeDragBy() 之前使用beginFakeDrag()完成后endFakeDrag()

  • 此 API 可以轻松地与 onPageScrollStateChanged 一起使用来自ViewPager2.OnPageChangeCallback ,您可以通过 isFakeDragging() 区分编程拖动和用户拖动方法
  • 如果给定的项目正确,上面的示例实现不会进行安全检查。还可以考虑为 UI 的生命周期添加取消功能,这可以通过 RxJava 轻松实现。

关于android - 以编程方式滑动时更改 ViewPager2 滚动速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57505875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com