23

スワイプを無効にしたいのですが、右側だけです。この回答で実用的な解決策を見つけました。残念ながら、これはソース全体をコピーしViewPagerて目標を達成します。既存のクラスを継承し、複製しないメソッドはありますか?

4

7 に答える 7

23

これはViewPagerクラスで、方向ページングを無効にする可能性があります。ここですべての答えをチェックしてください。

public class CustomViewPager extends ViewPager {
    private float initialXValue;
    private SwipeDirection direction;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.direction = SwipeDirection.all;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.IsSwipeAllowed(event)) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.IsSwipeAllowed(event)) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    private boolean IsSwipeAllowed(MotionEvent event) {
        if(this.direction == SwipeDirection.all) return true;

        if(direction == SwipeDirection.none )//disable any swipe
            return false;

        if(event.getAction()==MotionEvent.ACTION_DOWN) {
            initialXValue = event.getX();
            return true;
        }

        if(event.getAction()==MotionEvent.ACTION_MOVE) {
            try {
                float diffX = event.getX() - initialXValue;
                if (diffX > 0 && direction == SwipeDirection.right ) {
                    // swipe from left to right detected
                    return false;
                }else if (diffX < 0 && direction == SwipeDirection.left ) {
                    // swipe from right to left detected
                    return false;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }

        return true;
    }

    public void setAllowedSwipeDirection(SwipeDirection direction) {
        this.direction = direction;
    }
于 2015-12-03T21:43:44.107 に答える
10

もう 1 つの簡単な方法は、setCurrentItem() を使用して、特定の位置に到達した場合に目的のスライドにスクロールして戻ることです。たとえば、これは前方スワイプのみを許可します。

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    @Override
    public void onPageSelected(int position) {
        if(position < mProgress) {
            mViewPager.setCurrentItem(mProgress, true);
        } else {
            mProgress = position;
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {}
});

または、最大スライドが必要な場合:

if(position > 4) {
    mViewPager.setCurrentItem(4, true);
}

この解決策では、技術的にはスワイプを完全に無効にすることはできません。スワイプ操作を行うと、許可されていないスライドのごく一部が表示されるためです。ただし、一部のアプリケーションでは、これが優先される場合があります。

于 2016-08-18T13:27:08.567 に答える
3

メソッドbeginFakeDrag()とを使用できますendFakeDrag()

beginFakeDrag()スワイプを無効にしたいendFakeDrag()場合と、もう一度有効にしたい場合。

このような:viewPager.beginFakeDrag();

于 2014-08-21T09:23:14.467 に答える
1
private float initialXValue;
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (this.mEnabled) {
        return super.onTouchEvent(event);
    }
    if(event.getAction()==MotionEvent.ACTION_DOWN){
        initialXValue = event.getX();
    }else if(event.getAction()==MotionEvent.ACTION_MOVE){
        if(detectSwipeToRight(event)){
            System.out.println("right swipe detected");
        }
    }
    return true;
}

private boolean detectSwipeToRight(MotionEvent event) {
    final int SWIPE_THRESHOLD = 100; // detect swipe
    boolean result = false;

    try {
        float diffX = event.getX() - initialXValue;
        if (Math.abs(diffX) > SWIPE_THRESHOLD) {
            if (diffX < 0) {
                // swipe from right to left detected ie.SwipeLeft
                result = true;
            }
        }
    } catch (Exception exception) {
        exception.printStackTrace();
    }
    return result;
}
于 2014-06-21T10:48:28.910 に答える
-3

独自の ViewPager サブクラスを作成し、canScrollHorizo​​ntally 関数をオーバーライドする必要があります

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#canScrollHorizo​​ntally(int)

于 2013-09-06T14:31:42.060 に答える