我使用了关于为ViewPager的幻灯片动画启用自定义Scroller的stackoveflow问题的this回答,它运行顺畅。它扩展了Scroller的类,并使用反射来访问mScroller
字段。
我现在想要的是满足某些条件(onTouch()和计时器)以恢复默认的滚动动画。
试图克隆mScroller
字段:
Interpolator decelerator = new DecelerateInterpolator();
try {
mScroller = ViewPager.class.getDeclaredField("mScroller");
cloneDefaultScroller = mScroller;
mScroller.setAccessible(true);
scroller = new CarouselScroller(pager.getContext(), decelerator);
mScroller.set(pager, scroller);
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
再次启用它
cloneDefaultScroller.setAccessible(true);
Scroller scroller1 = new Scroller(this);
cloneDefaultScroller.set(pager, scroller1)
其中cloneDefaultScroller
和mScroller
是:
Field mScroller;
Field cloneDefaultScroller;
但我得到的是一个仅移动几个像素的卷轴,我必须尝试10次才能获得#34;正常"滚动(从一页到另一页)。
任何人都可以提供帮助吗?谢谢
答案 0 :(得分:1)
首先,尝试将mScroller
重命名为mScrollerField
,为了您的理智......为什么?因为它只是ViewPager类的字段描述,而不是字段后面的对象。现在很明显,不需要cloneDefaultScroller
(您不需要ViewPager类中的其他字段描述,而是ViewPager实例中的字段值)
所以代码看起来像(变老并设置新代码):
Field mScrollerField;
Scroller mOldScroller;
Interpolator decelerator = new DecelerateInterpolator();
try {
mScrollerField= ViewPager.class.getDeclaredField("mScroller");
mScrollerField.setAccessible(true);
mOldScroller = (Scroller)mScrollerField.get(pager); //getting old value
scroller = new CarouselScroller(pager.getContext(), decelerator);
mScrollerField.set(pager, scroller);
} catch (NoSuchFieldException e) {
e.printStackTrace();
/*IMPORTANT at least pass the exception to logcat also for your
sanity (fx: in next version of compat library the field could be renamed
to mTheScroller and you could get NPE in restore code and then ask
stupid(without logcat) questions on SO why ...*/
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
并恢复:
mScrollerField.set(pager, mOldScroller);