本博文欢迎转载,转载请注明来自唔系好人之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 stub 11 } 12 13 // public FixedSpeedScroller(Context context, Interpolator interpolator, 14 // boolean flywheel) { 15 // super(context, interpolator, flywheel); 16 // // TODO Auto-generated constructor stub 17 // } 18 19 @Override 20 public void startScroll(int startX, int startY, int dx, int dy, int duration) { 21 // Ignore received duration, use fixed one instead 22 super.startScroll(startX, startY, dx, dy, mDuration); 23 } 24 25 @Override 26 public void startScroll(int startX, int startY, int dx, int dy) { 27 // Ignore received duration, use fixed one instead 28 super.startScroll(startX, startY, dx, dy, mDuration); 29 } 30 31 /** 32 * @Description 设置滑动间隔 33 * @author Created by qinxianyuzou on 2014-10-29. 34 * @param duration 35 */ 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已经不再像以前一样,翻页秒翻,而是带了一个滑动的效果。