恢复默认的ViewPager滚动条

时间:2014-10-14 08:11:55

标签: android android-viewpager

我使用了关于为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)

其中cloneDefaultScrollermScroller是:

  Field mScroller;
  Field cloneDefaultScroller;

但我得到的是一个仅移动几个像素的卷轴,我必须尝试10次才能获得#34;正常"滚动(从一页到另一页)。

任何人都可以提供帮助吗?谢谢

1 个答案:

答案 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);