6

ViewPagerサブクラスMyPager(ほぼ同じ) を使用しており、smooth パラメータを true に設定してそのメソッドsetCurrentItem(int index, boolean smooth)を使用しています。パラメータを「false」に設定した場合よりも実際には少しスムーズですが、遷移をより見やすくするためにアニメーションの長さを長くしたいと思います。

さまざまな投稿からいくつかの情報を収集しましたが、このソリューションは完璧に見えます. 私はこのコードで終わった」

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));
    }

}

scroller.set(this, mScroller);問題は、 MyPagerの行を実行しているときに、この例外を取り除くことができないということです:

java.lang.IllegalArgumentException: invalid value for field

何か案が?

4

1 に答える 1

7

コードのこの部分を変更して、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());
    }

そして、出力を投稿しますか?

編集:問題は、インポートステートメントが正しくないことです。mScrollerは であり、android.widget.Scrollerそれに を割り当てることはできませんcom.WazaBe.HoloEverywhere.widget.Scroller

于 2013-01-08T16:11:19.610 に答える