34

ViewPager (サポート ライブラリ) を使用しています。ViewPager が表示されているページを変更するたびに、左または右にスクロールしていることを知りたいです。

解決策を教えてください。推薦も大歓迎です。

ありがとう

4

15 に答える 15

44

setOnPageChangeListenerあなたに設定ViewPager

変数をグローバルに保つ

private int lastPosition = 0;

そして

@Override
public void onPageSelected(int arg0) {
    if (lastPosition > position) {
         System.out.println("Left");
      }else if (lastPosition < position) {
         System.out.println("Right");
      }
      lastPosition = position;
}
于 2012-12-02T08:05:51.903 に答える
21
  1. これは ViewPager.OnPageChangeListener の onPageScrolled() メソッドでの私の簡単な解決です:

ここに画像の説明を入力

于 2015-12-18T13:10:05.910 に答える
3

クラスメンバー変数を保持して、最後にアクセスしたページを保存できます

private int mLastVisitedPageIndex = 0;

次に、次の関数を使用して方向を確認します

@Override
public void onPageSelected(int i) {
    boolean isMovingForward = mLastVisitedPageIndex < i?true:false;
    //Use isMovingForward variable anywhere now
    mLastVisitedPageIndex = i;
}
于 2014-10-16T06:39:33.537 に答える
2

インターフェイスを使用しViewPager.OnPageChangeListenerます。に渡された position 引数を使用してonPageSelected、それを前の値と比較して、 がどちらの方向ViewPagerにスクロールされたかを把握できます。

于 2012-12-02T08:03:04.813 に答える
1

swipeLeft() および swipeRight() メソッドを含めることができ、その onTouchEvent(MotionEvent event) メソッドに ACTION_MOVE および ACTION_CANCEL ケースを含めることができる Custom Viewpager を使用してこれを行うこともできます。

// 役立つ場合は、これがコードになる可能性があります。

public class SwiperViewPager extends ViewPager {

    SwiperListener mSwiperListener;
    private float downX;
    private float downY;
    private boolean isTouchCaptured;
    private float upX1;
    private float upY1;
    private float upX2;
    private float upY2;

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

    public SwiperViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private float x1, x2;
    static final int min_distance = 20;

    boolean eventSent = false;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE: {
                downX = event.getX();
                downY = event.getY();

                if (!isTouchCaptured) {
                    upX1 = event.getX();
                    upY1 = event.getY();
                    isTouchCaptured = true;
                } else {
                    upX2 = event.getX();
                    upY2 = event.getY();
                    float deltaX = upX1 - upX2;
                    float deltaY = upY1 - upY2;
                    //HORIZONTAL SCROLL
                    if (Math.abs(deltaX) > Math.abs(deltaY)) {
                        if (Math.abs(deltaX) > min_distance) {
                            // left or right
                            if (deltaX < 0) {
                                if(!eventSent && mSwiperListener!=null){
                                    mSwiperListener.onLeftSwipe();
                                    eventSent = true;
                                }
                            }
                            if (deltaX > 0) {
                                if(!eventSent && mSwiperListener!=null){
                                    if(mSwiperListener.onRightSwipe()){
                                        eventSent = true;
                                        return false;
                                    }
                                }
                            }
                        } else {
                            //not long enough swipe...
                        }
                    }
                    //VERTICAL SCROLL
                    else {
                        if (Math.abs(deltaY) > min_distance) {
                            // top or down
                            if (deltaY < 0) {

                            }
                            if (deltaY > 0) {

                            }
                        } else {
                            //not long enough swipe...
                        }
                    }
                }
            }
            break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:{
                isTouchCaptured = false;
                eventSent = false;
            }

        }
        return super.onTouchEvent(event);
    }

    public void setmSwiperListener(SwiperListener mSwiperListener) {
        this.mSwiperListener = mSwiperListener;
    }

    public static interface SwiperListener {
        public boolean onLeftSwipe();

        public boolean onRightSwipe();
    }

}
于 2016-04-21T09:31:03.207 に答える
1

この実装で問題を解決しました。それが役に立てば幸い。

public static final float EPSILON= 0.001f;

@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {

    // initial position (positionOffset == 0)
    if (positionOffset < EPSILON) {
        mIsRight = positionOffset < 0.5;
        return;
    }

    // code here
    if (mIsRight) {
    } else {
    }
}
于 2015-10-19T10:34:30.377 に答える
0

スクロール方向が起こっている間に知ることができる方法は次のとおりです。に を設定するだけOnPageChangeCallback()ですViewPager。の現在のページを保存ViewPagerし、 のパラメータOnPageSelected()と比較します。現在のページが より小さいか等しい場合は右にスクロールし、そうでない場合は左にスクロールします。positionOnPageScrolled()position

var currentPage = 0
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
    override fun onPageSelected(position: Int) {
        super.onPageSelected(position)
        currentPage = position
    }

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        super.onPageScrolled(position, positionOffset, positionOffsetPixels)
        if (currentPage <= position) {
            // We are scrolling right
        } else {
            // We are scrolling left
        }
    }
})
于 2021-03-03T02:54:05.513 に答える
-1
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            if(position  == pager.getCurrentItem()){
                // Move Right
            }
            else{
                // Move Left
            }

        }
于 2015-08-21T08:40:56.390 に答える