【问题标题】:Increase viewpager smoothscroll duration [duplicate]增加viewpager平滑滚动持续时间[重复]
【发布时间】:2012-12-22 08:26:09
【问题描述】:

我正在使用ViewPager 子类MyPager(几乎相同),我使用它的setCurrentItem(int index, boolean smooth) 方法,将平滑参数设置为true。它实际上比将参数设置为“false”要平滑一些,但我想增加动画持续时间以使过渡更加明显。

我从不同的帖子中收集了一些信息,this solution 看起来很完美。我最终得到了这段代码”

MyPager.java:

public class MyPager extends ViewPager {
    public MyPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
        postInitViewPager();
    }

    private ScrollerCustomDuration mScroller = null;

    /**
     * Override the Scroller instance with our own class so we can change the
     * duration
     */
    private void postInitViewPager() {
        try {
             Class<?> viewpager = ViewPager.class;
                Field scroller = viewpager.getDeclaredField("mScroller");
                scroller.setAccessible(true);
                Field interpolator = viewpager.getDeclaredField("sInterpolator");
                interpolator.setAccessible(true);

                mScroller = new ScrollerCustomDuration(getContext(),
                        (Interpolator) interpolator.get(null));
                scroller.set(this, mScroller);
        } catch (Exception e) {
            Log.e("MyPager", e.getMessage());
        }
    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
        mScroller.setScrollDurationFactor(scrollFactor);
    }
}

ScrollerCustomDuration.java

public class ScrollerCustomDuration extends Scroller {
    private double mScrollFactor = 2;

    public ScrollerCustomDuration(Context context) {
        super(context);
    }

    public ScrollerCustomDuration(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    public ScrollerCustomDuration(Context context,
        Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
        mScrollFactor = scrollFactor;
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy,
            int duration) {
        super.startScroll(startX, startY, dx, dy,
                (int) (duration * mScrollFactor));
    }

}

问题是,当运行 MyPager 的 scroller.set(this, mScroller); 行时,我无法摆脱这个异常:

java.lang.IllegalArgumentException: invalid value for field

有什么想法吗?

【问题讨论】:

  • mScroller = new ScrollerCustomDuration(getContext(), (Interpolator) interpolator.get(null));你为什么放 interpolator.get(null) ?
  • 嗯,其实我没有,但那是在我所指的帖子中......你有什么建议?
  • 顺便说一句,当我用“ mScroller = new ScrollerCustomDuration(getContext(), new DecelerateInterpolator());”替换时,我有同样的例外情况
  • 您能在您的代码中编辑并发布import 语句吗?
  • NVM,看看我的回答;你也使用interpolator.get(null),因为interpolator 是静态的,不属于实例。

标签: android android-viewpager android-animation


【解决方案1】:

能否修改这部分代码,插入一条Log语句?

private void postInitViewPager() {
    try {
         Class<?> viewpager = ViewPager.class;
            Field scroller = viewpager.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            Field interpolator = viewpager.getDeclaredField("sInterpolator");
            interpolator.setAccessible(true);

            mScroller = new ScrollerCustomDuration(getContext(),
                    (Interpolator) interpolator.get(null));
            Log.d("TAG", "mScroller is: " + mScroller + ", "
                + mScroller.getClass().getSuperclass().getCanonicalName() + "; this class is "
                + this + ", " + getClass().getSuperclass().getCanonicalName());
            scroller.set(this, mScroller);
    } catch (Exception e) {
        Log.e("MyPager", e.getMessage());
    }

然后发布输出?

编辑:问题是导入语句不正确。 mScrollerandroid.widget.Scroller,您不能为其分配 com.WazaBe.HoloEverywhere.widget.Scroller

【讨论】:

  • 这里是:mScroller 是:com.myproject.components.ScrollerCustomDuration@416ce8f8, com.WazaBe.HoloEverywhere.widget.Scroller;这个类是 com.myproject.components.MyPager@416c7550, android.support.v4.view.ViewPager
  • 啊,这就是问题所在。您正在导入错误的Scroller。确保你有import android.widget.Scroller;。不是com.WazaBe.HoloEverywhere.widget.Scroller
  • 它有效,非常感谢!我让你编辑你的答案或发布一个新答案,以便我可以验证它 =)
  • Np,很高兴你成功了!自动导入并不总是正确的:)
  • 如果你正在使用proguard,别忘了添加这一行:-keep class android.support.v4.** {*;} 否则你会在getDeclaredField()时得到空指针跨度>
猜你喜欢
  • 2021-03-31
  • 2021-10-19
  • 2014-03-12
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多