1. ホーム
  2. android

[解決済み] Viewpagerコントローラの速度低下について

2022-10-18 17:11:53

質問

androidのビューページャーアダプターで、スクロール速度を遅くする方法はありますか?


このコードを見ても 何を間違えているのかがわからない。

try{ 
    Field mScroller = mPager.getClass().getDeclaredField("mScroller"); 
    mScroller.setAccessible(true); 
    Scroller scroll = new Scroller(cxt);
    Field scrollDuration = scroll.getClass().getDeclaredField("mDuration");
    scrollDuration.setAccessible(true);
    scrollDuration.set(scroll, 1000);
    mScroller.set(mPager, scroll);
}catch (Exception e){
    Toast.makeText(cxt, "something happened", Toast.LENGTH_LONG).show();
} 

何も変わらないのに例外が発生しない?

どのように解決するのですか?

私はHighFlyerのコードから始めました。これは確かにmScrollerフィールドを変更しましたが(これは素晴らしいスタートです)、ViewPagerがスクロールを要求するときに明示的にmScrollerに期間を渡すので、スクロールの期間を延長する助けにはなりませんでした。

ViewPager を拡張しても、重要なメソッド (smoothScrollTo) がオーバーライドできないため、機能しませんでした。

結局、このコードでScrollerを拡張することで解決しました。

public class FixedSpeedScroller extends Scroller {

    private int mDuration = 5000;

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

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

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


    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }
}

そして、このように使うことで

try {
    Field mScroller;
    mScroller = ViewPager.class.getDeclaredField("mScroller");
    mScroller.setAccessible(true); 
    FixedSpeedScroller scroller = new FixedSpeedScroller(mPager.getContext(), sInterpolator);
    // scroller.setFixedDuration(5000);
    mScroller.set(mPager, scroller);
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}

基本的にデュレーションを5秒にハードコーディングして、ViewPagerに使わせています。

これが役に立つといいのですが。