カスタムViewPager
のトランジションのアニメーションをすべて無効にします。このビューページャーには4つのタブがあり、各タブはFragment
をロードします。ビューページャーは、タブを切り替えることを行います。たとえば、最初のタブはインデックス、2番目はマップなどです。
問題は、最初のタブを選択して4番目のタブをクリックすると、ViewPager
が2番目と3番目のタブを通過して4番目で停止する様子を見ることができ、それが望ましくないことです。発生する。
ユーザーが表示する新しいタブを選択するたびにViewPager
からsetAnimation
を使用しようとするこのnull
のすべてのアニメーションを無効にしようとしましたが、それでもまだ作業。
これを達成するためのアイデアはありますか?事前に感謝します!
編集:onCreateAnimation
ごとにFragment
をオーバーライドしようとしましたが、まだ機能していません
最終的にわかったのは、false
の滑らかなスクロールであるViewPager
に追加のパラメーターを付けてmViewPager.setCurrentItem(position)
を呼び出すだけで問題を解決できることです。この後、スムージングなしでスクロールが行われるため、アニメーションは表示されません。
別のソリューションを次に示します。
コードスニペット:
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, false);
}
@Override
public void setCurrentItem(int item) {
super.setCurrentItem(item, false);
}
smoothScrollをfalseに設定すると、スクロールアニメーションが無効になります。
私はここで私の実装であるユーザーによるスワイプでもスワイプアニメーションを無効にすることを探していました
1-Viewpager
メソッドonInterceptTouchEvent
およびonTouchEvent
をオーバーライドします
2-独自のGestureDetector
を作成
3-スワイプジェスチャーを検出し、setCurrentItem(item, false)
を使用します
ViewPager
public class ViewPagerNoSwipe extends ViewPager {
private final GestureDetector gestureDetector;
private OnSwipeListener mOnSwipeListener;
public void setOnSwipeListener(OnSwipeListener onSwipeListener) {
mOnSwipeListener = onSwipeListener;
}
public ViewPagerNoSwipe(@NonNull Context context) {
super(context);
gestureDetector = new GestureDetector(context, new GestureListener());
}
public ViewPagerNoSwipe(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
gestureDetector = new GestureDetector(context, new GestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return false;
}
public class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeRight();
} else {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeLeft();
}
result = true;
}
} else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeBottom();
} else {
if(mOnSwipeListener!=null)
mOnSwipeListener.onSwipeTop();
}
result = true;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public interface OnSwipeListener {
void onSwipeRight();
void onSwipeLeft();
void onSwipeTop();
void onSwipeBottom();
}
}
viewPagerを設定するときにswipeListenerを設定します
postsPager.setOnSwipeListener(new ViewPagerNoSwipe.OnSwipeListener() {
@Override
public void onSwipeRight() {
postsPager.setCurrentItem(postsPager.getCurrentItem() + 1,false);
}
@Override
public void onSwipeLeft() {
postsPager.setCurrentItem(postsPager.getCurrentItem() - 1, false);
}
...
}
Tabselectedリスナーで、setCurrentItemの2番目の引数をfalseに設定して、スムーズなスクロールを無効にします。
mBottomNavigation.setOnTabSelectedListener((position, wasSelected) -> {
switch (position) {
case 0:
viewPager.setCurrentItem(0, false);
return true;
case 1:
viewPager.setCurrentItem(1, false);
return true;
case 2:
viewPager.setCurrentItem(2, false);
return true;
}
return false;
});