首页 > 代码库 > Android开发心得——viewpager调用setCurrentItem设页面没有滑动效果?我来帮你

Android开发心得——viewpager调用setCurrentItem设页面没有滑动效果?我来帮你

本博文欢迎转载,转载请注明来自唔系好人之Android小码农

最近做项目,遇到一个焦点图的问题,而我,在这段时间可以说是viewpager的爱好者,虽然有很多优秀的开源项目,但是我还是想要研究一下,viewpager,怎么自己做带有滑动效果的焦点图切换。

通过一轮的网络搜索,最终研究到一个方法通过反射来获取viewpager的内部属性,然后设置他的滑动属性。

说实话,对于我这种半路出家的和尚来说,反射是个什么真的不懂,我也是听同事说的,他这个反射的作用就是强制获取了一个并不公开的内部属性,并修改来达到目的。

好了,废话不多说,先来看看我们要做什么,首先是建立一个类继承scroller,并重写scroller,代码大概如下:

 1     private int mDuration = 1500; 2  3     public FixedSpeedScroller(Context context) { 4         super(context); 5         // TODO Auto-generated constructor stub 6     } 7  8     public FixedSpeedScroller(Context context, Interpolator interpolator) { 9         super(context, interpolator);10         // TODO Auto-generated constructor stub11     }12 13     // public FixedSpeedScroller(Context context, Interpolator interpolator,14     // boolean flywheel) {15     // super(context, interpolator, flywheel);16     // // TODO Auto-generated constructor stub17     // }18 19     @Override20     public void startScroll(int startX, int startY, int dx, int dy, int duration) {21         // Ignore received duration, use fixed one instead22         super.startScroll(startX, startY, dx, dy, mDuration);23     }24 25     @Override26     public void startScroll(int startX, int startY, int dx, int dy) {27         // Ignore received duration, use fixed one instead28         super.startScroll(startX, startY, dx, dy, mDuration);29     }30 31     /**32      * @Description 设置滑动间隔33      * @author Created by qinxianyuzou on 2014-10-29.34      * @param duration35      */36     public void setDuration(int duration) {37         mDuration = duration;38     }

其中有一个关键的属性是mDuration,这个是设置滑动的间隔,单位是毫秒(有经验的其实都已经看懂了),我设置了一个外部方法用于设置这个属性。

另外有一个初始化方法被我注释了是因为这个方法最低支持到API11,而我的项目要兼容到API8,所以注释掉了。说到这个,真的要吐槽一下,现在谁还用2.3的操作系统?老爷机都已经装上Android4.0以上的系统了。

在写好这个类之后就是调用了,只要写在你要调用的viewpager的activity里面就可以,当然,你记得给viewpager初始化,上代码

 1         Interpolator sInterpolator = new AccelerateInterpolator(); 2         try { 3             Field mScroller; 4             mScroller = ViewPager.class.getDeclaredField("mScroller"); 5             mScroller.setAccessible(true);  6             FixedSpeedScroller scroller = new FixedSpeedScroller(vp_circleSummary_teacher.getContext(), sInterpolator); 7             scroller.setDuration(1000); 8             mScroller.set(vp_circleSummary_teacher, scroller); 9         } catch (NoSuchFieldException e) {10         } catch (IllegalArgumentException e) {11         } catch (IllegalAccessException e) {12         }

原理不是很懂,大概就是有个大牛去看了viewpager的源码,然后发现了field这个类是用于设置viewpager的滑动问题,于是就被用反射抽取了出来,并且设置。

在set Field这个属性之前,记得设置间隔,不然就会变成上面那个scroller类的默认时间。

经过这么设置一下之后,你在用settCurrentItem来设置页面,那么就会发现,你的viewpager已经不再像以前一样,翻页秒翻,而是带了一个滑动的效果。

Android开发心得——viewpager调用setCurrentItem设页面没有滑动效果?我来帮你