ViewPager无限自动轮播+动画

    xiaoxiao2021-12-14  17

    ViewPager几乎在每一个app中都会有使用,可以做导航页,也可以做广告、图片的播放。最近在做的app也用到了ViewPager,具体要实现的功能是能够无限轮播,并且在自动轮播时,图片在切换时能够有动画效果,当手指触摸时停止自动轮播,手指抬起时继续自动轮播。

    闲话不多说,直接上代码

    自定义ViewPager:

    [java] view plain copy public class MyViewPager extends ViewPager {   // 当前页   private int currentItem;   // ViewPagerAdapter实例   private ViewPagerAdapter mAdapter;      public MyViewPager(Context context) {       super(context);   }      public MyViewPager(Context context, AttributeSet attrs) {       super(context, attrs);   }      @Override   public void setAdapter(PagerAdapter adapter) {       mAdapter = (ViewPagerAdapter) adapter;       super.setAdapter(mAdapter);   }      /**   * 获取当前页   *    * @return   */   public int getCurrentItem() {       return mAdapter.getMyPosition();   }      /**   * 获取MyViewPager实例   *    * @return   */   public MyViewPager getMyViewPager() {       return mAdapter.getMyViewPager();   }      /**   * 设置当前页   *    * @param item   * @param smoothScroll   */   public void setCurrentItem(int item, boolean smoothScroll) {       super.setCurrentItem(item, smoothScroll);   }      // 是否自动轮播   private boolean isStart = true;   // Handler   private Handler mHandler = new Handler();   // 图片自动轮播Task   private Runnable mImageTimerTask = new Runnable() {          @Override       public void run() {           try {// 自定义图片切换速度               Field field = ViewPager.class.getDeclaredField("mScroller");               field.setAccessible(true);               FixedSpeedScroller scroller = new FixedSpeedScroller(                       getContext(), new AccelerateInterpolator());               field.set(getMyViewPager(), scroller);               scroller.setmDuration(500);           } catch (Exception e) {               e.printStackTrace();           }           currentItem = getCurrentItem();           int amount = currentItem;                          /**                   * 解决往左滑动后变成向左自动轮播的bug                   */           if(oldCurrentItem < currentItem){               setCurrentItem(currentItem, true);           }else{               currentItem += 2;               setCurrentItem(currentItem, true);           }           oldCurrentItem = amount;           if (isStart)               mHandler.postDelayed(mImageTimerTask, 2000);       }   };      /**   * 触摸事件: ACTION_DOWN 停止自动轮播 ACTION_UP 开始自动轮播   */   @Override   public boolean dispatchTouchEvent(MotionEvent event) {       if (event.getAction() == MotionEvent.ACTION_UP) {           // 开始图片滚动           startImageTimerTask();       } else if (event.getAction() == MotionEvent.ACTION_DOWN) {           // 停止图片滚动           stopImageTimerTask();       }       return super.dispatchTouchEvent(event);   }      /**   * 停止自动轮播   */   public void stopImageTimerTask() {       isStart = false;       mHandler.removeCallbacks(mImageTimerTask);   }      /**   * 开始自动轮播   */   public void startImageTimerTask() {       isStart = true;       mHandler.postDelayed(mImageTimerTask, 2000);   }  

      自定义PagerAdapter:

    [java] view plain copy  public class ViewPagerAdapter extends PagerAdapter {       private List<view> viewList;       private int mPosition;       private MyViewPager mViewPager;          public ViewPagerAdapter(List<view> viewList, MyViewPager viewPager) {           super();           this.viewList = viewList;           mViewPager = viewPager;       }          /**       * 将count设为最大的整数,以达到无限轮播的效果       */       @Override       public int getCount() {           return Integer.MAX_VALUE;       }          @Override       public boolean isViewFromObject(View view, Object object) {           return view == object;       }          @Override       public void destroyItem(ViewGroup <a href="http://lib.csdn.net/base/docker" class='replace_word' title="Docker知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Container</a>, int position, Object object) {           ((ViewPager) container).removeView(viewList.get(position                   % viewList.size()));          }          @Override       public Object instantiateItem(ViewGroup container, int position) {           mPosition = position;           ((ViewPager) container)                   .addView(viewList.get(position % viewList.size()));           return viewList.get(position % viewList.size());       }          /**       * 获取当前页       *        * @return       */       public int getMyPosition() {           return mPosition;       }          /**       * 获取MyViewPager实例       *        * @return       */       public MyViewPager getMyViewPager() {           return mViewPager;       }      }</view></view>  

    切换动画google给的DepthPageTransformer:

         

    [java] view plain copy public class DepthPageTransformer implements PageTransformer {       private static final float MIN_SCALE = 0.75f;          @Override       public void transformPage(View view, float position) {           int pageWidth = view.getWidth();           if (position < -1) {               view.setAlpha(0);           } else if (position <= 0) {               view.setAlpha(1);               view.setTranslationX(0);               view.setScaleX(1);               view.setScaleY(1);           } else if (position <= 1) {               view.setAlpha(1 - position);               view.setTranslationX(pageWidth * -position);               float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)                       * (1 - Math.abs(position));               view.setScaleX(scaleFactor);               view.setScaleY(scaleFactor);           } else {                view.setAlpha(0);              }       }      }  

         切换速度自定义:

          

    [java] view plain copy public class FixedSpeedScroller extends Scroller {       private int mDuration = 1500;          public FixedSpeedScroller(Context context) {           super(context);       }          public FixedSpeedScroller(Context context, Interpolator interpolator) {           super(context, interpolator);       }          @Override       public void startScroll(int startX, int startY, int dx, int dy, int duration) {           super.startScroll(startX, startY, dx, dy, mDuration);       }          @Override       public void startScroll(int startX, int startY, int dx, int dy) {           super.startScroll(startX, startY, dx, dy, mDuration);       }          public void setmDuration(int time) {           mDuration = time;       }          public int getmDuration() {           return mDuration;       }   }  

         小圆点的变换:

          

    [java] view plain copy public void onPageSelected(int position) {           dots.get(oldPosition % viewList.size()).setBackgroundResource(                   R.drawable.dot_normal);           dots.get(position % viewList.size()).setBackgroundResource(                   R.drawable.dot_focused);              oldPosition = position;       }  

         最后:

         

    [java] view plain copy mViewPager.setCurrentItem(500);           mViewPager.setPageTransformer(truenew DepthPageTransformer());           mViewPager.startImageTimerTask();  

    转载请注明原文地址: https://ju.6miu.com/read-963395.html

    最新回复(0)