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 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已经不再像以前一样,翻页秒翻,而是带了一个滑动的效果。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。