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

来源:互联网 发布:nginx cc攻击防御 编辑:程序博客网 时间:2024/05/20 08:24

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语言的反射机制。

0 0
原创粉丝点击