ViewPager无限自动轮播+动画

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

闲话不多说,直接上代码

自定义ViewPager:

  1. public class MyViewPager extends ViewPager {  
  2. // 当前页  
  3. private int currentItem;  
  4. // ViewPagerAdapter实例  
  5. private ViewPagerAdapter mAdapter;  
  6.   
  7. public MyViewPager(Context context) {  
  8.     super(context);  
  9. }  
  10.   
  11. public MyViewPager(Context context, AttributeSet attrs) {  
  12.     super(context, attrs);  
  13. }  
  14.   
  15. @Override  
  16. public void setAdapter(PagerAdapter adapter) {  
  17.     mAdapter = (ViewPagerAdapter) adapter;  
  18.     super.setAdapter(mAdapter);  
  19. }  
  20.   
  21. /** 
  22.  * 获取当前页 
  23.  *  
  24.  * @return 
  25.  */  
  26. public int getCurrentItem() {  
  27.     return mAdapter.getMyPosition();  
  28. }  
  29.   
  30. /** 
  31.  * 获取MyViewPager实例 
  32.  *  
  33.  * @return 
  34.  */  
  35. public MyViewPager getMyViewPager() {  
  36.     return mAdapter.getMyViewPager();  
  37. }  
  38.   
  39. /** 
  40.  * 设置当前页 
  41.  *  
  42.  * @param item 
  43.  * @param smoothScroll 
  44.  */  
  45. public void setCurrentItem(int item, boolean smoothScroll) {  
  46.     super.setCurrentItem(item, smoothScroll);  
  47. }  
  48.   
  49. // 是否自动轮播  
  50. private boolean isStart = true;  
  51. // Handler  
  52. private Handler mHandler = new Handler();  
  53. // 图片自动轮播Task  
  54. private Runnable mImageTimerTask = new Runnable() {  
  55.   
  56.     @Override  
  57.     public void run() {  
  58.         try {// 自定义图片切换速度  
  59.             Field field = ViewPager.class.getDeclaredField("mScroller");  
  60.             field.setAccessible(true);  
  61.             FixedSpeedScroller scroller = new FixedSpeedScroller(  
  62.                     getContext(), new AccelerateInterpolator());  
  63.             field.set(getMyViewPager(), scroller);  
  64.             scroller.setmDuration(500);  
  65.         } catch (Exception e) {  
  66.             e.printStackTrace();  
  67.         }  
  68.         currentItem = getCurrentItem();  
  69.         int amount = currentItem;  
  70.                        /** 
  71.                  * 解决往左滑动后变成向左自动轮播的bug 
  72.                  */  
  73.         if(oldCurrentItem < currentItem){  
  74.             setCurrentItem(currentItem, true);  
  75.         }else{  
  76.             currentItem += 2;  
  77.             setCurrentItem(currentItem, true);  
  78.         }  
  79.         oldCurrentItem = amount;  
  80.         if (isStart)  
  81.             mHandler.postDelayed(mImageTimerTask, 2000);  
  82.     }  
  83. };  
  84.   
  85. /** 
  86.  * 触摸事件: ACTION_DOWN 停止自动轮播 ACTION_UP 开始自动轮播 
  87.  */  
  88. @Override  
  89. public boolean dispatchTouchEvent(MotionEvent event) {  
  90.     if (event.getAction() == MotionEvent.ACTION_UP) {  
  91.         // 开始图片滚动  
  92.         startImageTimerTask();  
  93.     } else if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  94.         // 停止图片滚动  
  95.         stopImageTimerTask();  
  96.     }  
  97.     return super.dispatchTouchEvent(event);  
  98. }  
  99.   
  100. /** 
  101.  * 停止自动轮播 
  102.  */  
  103. public void stopImageTimerTask() {  
  104.     isStart = false;  
  105.     mHandler.removeCallbacks(mImageTimerTask);  
  106. }  
  107.   
  108. /** 
  109.  * 开始自动轮播 
  110.  */  
  111. public void startImageTimerTask() {  
  112.     isStart = true;  
  113.     mHandler.postDelayed(mImageTimerTask, 2000);  
  114. }  

  自定义PagerAdapter:

  1.  public class ViewPagerAdapter extends PagerAdapter {  
  2.     private List<view> viewList;  
  3.     private int mPosition;  
  4.     private MyViewPager mViewPager;  
  5.   
  6.     public ViewPagerAdapter(List<view> viewList, MyViewPager viewPager) {  
  7.         super();  
  8.         this.viewList = viewList;  
  9.         mViewPager = viewPager;  
  10.     }  
  11.   
  12.     /** 
  13.      * 将count设为最大的整数,以达到无限轮播的效果 
  14.      */  
  15.     @Override  
  16.     public int getCount() {  
  17.         return Integer.MAX_VALUE;  
  18.     }  
  19.   
  20.     @Override  
  21.     public boolean isViewFromObject(View view, Object object) {  
  22.         return view == object;  
  23.     }  
  24.   
  25.     @Override  
  26.     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) {  
  27.         ((ViewPager) container).removeView(viewList.get(position  
  28.                 % viewList.size()));  
  29.   
  30.     }  
  31.   
  32.     @Override  
  33.     public Object instantiateItem(ViewGroup container, int position) {  
  34.         mPosition = position;  
  35.         ((ViewPager) container)  
  36.                 .addView(viewList.get(position % viewList.size()));  
  37.         return viewList.get(position % viewList.size());  
  38.     }  
  39.   
  40.     /** 
  41.      * 获取当前页 
  42.      *  
  43.      * @return 
  44.      */  
  45.     public int getMyPosition() {  
  46.         return mPosition;  
  47.     }  
  48.   
  49.     /** 
  50.      * 获取MyViewPager实例 
  51.      *  
  52.      * @return 
  53.      */  
  54.     public MyViewPager getMyViewPager() {  
  55.         return mViewPager;  
  56.     }  
  57.   
  58. }</view></view>  

切换动画google给的DepthPageTransformer:

     

[java] view plain copy
  1. public class DepthPageTransformer implements PageTransformer {  
  2.     private static final float MIN_SCALE = 0.75f;  
  3.   
  4.     @Override  
  5.     public void transformPage(View view, float position) {  
  6.         int pageWidth = view.getWidth();  
  7.         if (position < -1) {  
  8.             view.setAlpha(0);  
  9.         } else if (position <= 0) {  
  10.             view.setAlpha(1);  
  11.             view.setTranslationX(0);  
  12.             view.setScaleX(1);  
  13.             view.setScaleY(1);  
  14.         } else if (position <= 1) {  
  15.             view.setAlpha(1 - position);  
  16.             view.setTranslationX(pageWidth * -position);  
  17.             float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)  
  18.                     * (1 - Math.abs(position));  
  19.             view.setScaleX(scaleFactor);  
  20.             view.setScaleY(scaleFactor);  
  21.         } else {   
  22.             view.setAlpha(0);  
  23.   
  24.         }  
  25.     }  
  26.   
  27. }  

     切换速度自定义:

      

[java] view plain copy
  1. public class FixedSpeedScroller extends Scroller {  
  2.     private int mDuration = 1500;  
  3.   
  4.     public FixedSpeedScroller(Context context) {  
  5.         super(context);  
  6.     }  
  7.   
  8.     public FixedSpeedScroller(Context context, Interpolator interpolator) {  
  9.         super(context, interpolator);  
  10.     }  
  11.   
  12.     @Override  
  13.     public void startScroll(int startX, int startY, int dx, int dy, int duration) {  
  14.         super.startScroll(startX, startY, dx, dy, mDuration);  
  15.     }  
  16.   
  17.     @Override  
  18.     public void startScroll(int startX, int startY, int dx, int dy) {  
  19.         super.startScroll(startX, startY, dx, dy, mDuration);  
  20.     }  
  21.   
  22.     public void setmDuration(int time) {  
  23.         mDuration = time;  
  24.     }  
  25.   
  26.     public int getmDuration() {  
  27.         return mDuration;  
  28.     }  
  29. }  

     小圆点的变换:

      

[java] view plain copy
  1. public void onPageSelected(int position) {  
  2.         dots.get(oldPosition % viewList.size()).setBackgroundResource(  
  3.                 R.drawable.dot_normal);  
  4.         dots.get(position % viewList.size()).setBackgroundResource(  
  5.                 R.drawable.dot_focused);  
  6.   
  7.         oldPosition = position;  
  8.     }  

     最后:

     

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值