我知道有办法改变动画持续时间的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”上显示警告:
无法解析字段“mScroller”
如果我们运行这段代码,那就不会工作,并给予我们下面的错误:
No field mScroller in class Landroidx/viewpager2/widget/ViewPager2; (declaration of 'androidx.viewpager2.widget.ViewPager2' appears in /data/app/{packagename}-RWJhF9Gydojax8zFyFwFXg==/base.apk)
那么我们如何才能实现这个功能呢?
4条答案
按热度按时间4bbkushb1#
基于this issue ticket,Android团队不打算支持ViewPager2的此类行为,工单建议使用
ViewPager2.fakeDragBy()
。这种方法的缺点是你必须提供页面宽度的像素,虽然如果你的页面宽度是相同的ViewPager的宽度,那么你可以使用该值代替。下面是示例实现
要支持
RTL
,您必须翻转提供给ViewPager2.fakeDragBy()
的值,因此在使用RTL
时,使用fakeDragBy(currentPxToDrag)
而不是fakeDragBy(-currentPxToDrag)
。根据官方文档,使用此功能时需要记住几件事:
fakeDragBy()
之前使用beginFakeDrag()
,完成后使用endFakeDrag()
ViewPager2.OnPageChangeCallback
中的onPageScrollStateChanged
一起使用,其中由于isFakeDragging()
方法,您可以区分编程拖动和用户拖动6vl6ewon2#
ViewPager2团队很难改变滚动速度。如果您查看方法setCurrentItemInternal,它们示例化了自己的私有ScrollToPosition(..)对象。沿着状态管理代码,所以这将是您必须以某种方式重写的方法。
作为一个解决方案,从这里:https://issuetracker.google.com/issues/122656759,他们说使用
(ViewPager2).fakeDragBy()
,这是超级丑陋的。不是最好的,只需要等待他们给予我们一个API来设置持续时间或复制他们的ViewPager2代码并直接修改他们的LinearLayoutImpl类。
deyfvvtc3#
当你想让ViewPager2按照你的速度、方向和页数滚动时,点击一些按钮,用你的参数调用这个函数。Direction可以是leftToRight = true,如果你想这样做,或者false,如果你想从右到左,持续时间以毫秒为单位,numberOfPages应该是1,除非你想一路回去,当它应该是你的页面数为该viewPager:
zynd9foi4#
M Tomczynski给出的解决方案(参考:https://stackoverflow.com/a/59235979/7608625)是一个很好的。但是,当与内置的setCurrentItem()沿着使用时,由于fakeDrag,我面临应用程序随机崩溃,即使我确保在使用setCurrentItem()之前调用endDrag()。所以我修改了解决方案,使用viewpager的嵌入式回收器视图的scrollBy()函数,它工作得很好,没有任何问题。