Android 顶部轮播 JazzyViewPager 改变滑动速度

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的时候加入:

	/**
	 * 设置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版权协议,转载请附上原文出处链接和本声明。