github上有个顶部轮播的开源项目JazzyViewPager-master,图片切换动画是手动控制的,利用定时+setCurrentItem方法可以实现自动切换,但是会出现一个问题,切换过程中的滑动速度特别快,并且这个速度不能更改,是写死的,经查找资料,可以用反射实现。先列出正确做法,然后再记录下我开始时的错误做法。
首先重写Scroller:
package com.yy.my.utils;
import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;
public class FixedSpeedScroller extends Scroller{
private int mDuration = 3000;
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) {
super(context, interpolator, flywheel);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
// TODO Auto-generated method stub
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
// TODO Auto-generated method stub
super.startScroll(startX, startY, dx, dy, mDuration);
}
public void setmDuration(int mDuration) {
this.mDuration = mDuration;
}
public int getmDuration() {
return mDuration;
}
}
/**
* 设置ViewPager的滑动速度
*/
private void initViewPagerScroll(){
try{
Field mScroller = null;
mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(getContext());
scroller.setmDuration(2500); //改变滑动速度
mScroller.set(this, scroller);
} catch (NoSuchFieldException e){
e.printStackTrace();
} catch (IllegalAccessException e){
e.printStackTrace();
} catch (IllegalArgumentException e){
e.printStackTrace();
}
}对于JazzyViewPager-master项目,只需在JazzyViewPager类的初始化方法里面调用initViewPagerScroll()即可。
由于本人对java反射不了解,看到JazzyViewPager继承了ViewPager,所以开始时是这样写的:
Field mScroller = null;
mScroller = JazzyViewPager.class.getDeclaredField("mScroller");然后发现抛出异常,说是没有找到“mScroller”,然后我就在JazzyViewPager中自定义了一个mScroller,结果没抛异常了,但是滑动速度没有改变。
现在想想,应该是这样的,原始ViewPager的setCurrentItem方法里面应该是用mScroller变量实现的滑动,由于JazzyViewPager里面没有复写setCurrentItem方法,所以这里应该调用原始的setCurrentItem方法,所以应该是从原始的ViewPager里面得到mScroller变量,然后用自己定义的scroller替换掉原始的,从而改变滑动速度。下面给出百度百科的java反射机制定义,跟我猜测的差不多,嘿嘿。。。。。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
版权声明:本文为wblyuyang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。