【问题标题】:Disable ViewPager scrolling animation禁用 ViewPager 滚动动画
【发布时间】:2014-08-02 16:56:00
【问题描述】:

从代码here,我有一个设置适配器的 ViewPager。有什么方法可以禁用滚动动画,以便在我滑动时它只是“跳转”到新页面?我不想禁用onTouchEventonInterceptTouchEvent 中的整个滚动功能,只是滑动动画。

mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

// Set up the ViewPager with the sections adapter.
mViewPager = (CustomViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);

【问题讨论】:

    标签: android animation scroll android-viewpager native


    【解决方案1】:

    我不知道是否有干净的解决方案。但是您可以使用一个技巧并使用另一个转换器撤消标准页面转换器。 NoPageTransformer 看起来像这样:

    private static class NoPageTransformer implements ViewPager.PageTransformer {
        public void transformPage(View view, float position) {
            if (position < 0) {
                view.setScrollX((int)((float)(view.getWidth()) * position));
            } else if (position > 0) {
                view.setScrollX(-(int) ((float) (view.getWidth()) * -position));
            } else {
                view.setScrollX(0);
            }
        }
    }
    

    要将其添加到您的 ViewPager,请调用:

    mViewPager.setPageTransformer(false, new NoPageTransformer());
    

    适用于 SDK 版本 16 及更高版本。

    【讨论】:

      【解决方案2】:

      科特林:

      viewpager.setPageTransformer(false, FadePageTransformer())
      
      
      inner class FadePageTransformer : ViewPager.PageTransformer {
          override fun transformPage(view: View, position: Float) {
              view.translationX = view.width * -position
      
              if (position <= -1.0f || position >= 1.0f) {
                  view.alpha = 0.0f
                  view.setVisibility(View.GONE);
              } else if (position == 0.0f) {
                  view.alpha = 1.0f
                  view.setVisibility(View.VISIBLE);
              } else {
                  // position is between -1.0F & 0.0F OR 0.0F & 1.0F
                  view.alpha = 1.0f - Math.abs(position)
                  view.setVisibility(View.GONE);
              }
          }
      }
      

      【讨论】:

      • 在 else 块中你应该设置 View.VISIBLE
      【解决方案3】:

      接受的答案仍然有滑动动画 我正在寻找禁用滑动动画甚至用户滑动 这是我的实现

      1-覆盖Viewpager方法onInterceptTouchEventonTouchEvent

      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);
      
                  }
                   ...
                 }
      

      【讨论】:

        【解决方案4】:
        viewPager.setPageTransformer(false, new NoPageTransformer());
        

        private static class NoPageTransformer implements ViewPager.PageTransformer {
            public void transformPage(@NonNull View view, float position) {
                view.setTranslationX(view.getWidth() * -position);
                if (position <= -1.0f || position >= 1.0f) {
                    view.setVisibility(View.GONE);
                } else if (position == 0.0f) {
                    view.setVisibility(View.VISIBLE);
                } else {
                    view.setVisibility(View.GONE);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-19
          • 1970-01-01
          • 2016-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-19
          相关资源
          最近更新 更多