スワイプを無効にしたいのですが、右側だけです。この回答で実用的な解決策を見つけました。残念ながら、これはソース全体をコピーしViewPager
て目標を達成します。既存のクラスを継承し、複製しないメソッドはありますか?
質問する
34153 次
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 サブクラスを作成し、canScrollHorizontally 関数をオーバーライドする必要があります
于 2013-09-06T14:31:42.060 に答える