Sae*_*esh 20 android androidx android-viewpager2
我知道有办法改变ViewPager编程幻灯片的动画持续时间(这里)。
但它不工作 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();
}
Run Code Online (Sandbox Code Playgroud)
IDE 给我关于“mScroller”的警告:
无法解析字段“mScroller”
如果我们运行此代码将无法工作并在下面给我们错误:
No field mScroller in class Landroidx/viewpager2/widget/ViewPager2; (declaration of 'androidx.viewpager2.widget.ViewPager2' appears in /data/app/{packagename}-RWJhF9Gydojax8zFyFwFXg==/base.apk)
Run Code Online (Sandbox Code Playgroud)
那么我们如何才能实现这个功能呢?
M T*_*ski 28
基于此问题票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()
}
Run Code Online (Sandbox Code Playgroud)
为了支持RTL你翻转供给价值ViewPager2.fakeDragBy(),所以从上面的例子,而不是fakeDragBy(-currentPxToDrag)使用fakeDragBy(currentPxToDrag)使用时RTL。
根据官方文档,使用它时要记住的几件事:
负值向前滚动,正值向后滚动(用 RTL 翻转)
在调用fakeDragBy()use之前beginFakeDrag()和完成之后endFakeDrag()
onPageScrollStateChanged从ViewPager2.OnPageChangeCallback,在这里可以的程序化阻力和用户拖动由于区分isFakeDragging()方法ViewPager2 团队很难改变滚动速度。如果您查看 setCurrentItemInternal 方法,它们会实例化自己的私有 ScrollToPosition(..) 对象。以及状态管理代码,因此这将是您必须以某种方式覆盖的方法。
作为这里的解决方案:https : //issuetracker.google.com/issues/122656759,他们说使用(ViewPager2).fakeDragBy()这是超级丑陋的。
不是最好的,只需要等待他们给我们一个 API 来设置持续时间或复制他们的 ViewPager2 代码并直接修改他们的 LinearLayoutImpl 类。
| 归档时间: |
|
| 查看次数: |
6729 次 |
| 最近记录: |