通过反射机制为ViewPager设置滑动效果

来源:互联网 发布:淘宝彩票在哪里 编辑:程序博客网 时间:2024/05/22 10:36

通过反射机制为ViewPager设置滑动效果

刚入职新公司,前几天熟悉项目,看到项目中牛逼的代码,不禁感到羞愧,同样是程序员为什么别人能写出那么高大上的代码!可能是自己太菜,看到稍微高级点的代码就感觉好屌,努力一点点积累啊,向大神们学习!下面进入正题!

自动轮播的Banner需求想必大家都做过,一般都是用handler定时控制滑动
handler.postSendDelayMessage(what,1000);
然后在handleMessage方法中处理切换逻辑
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);//第二个Boolean参数是否使用平滑效果;
或者开启一个线程new Threadnew Runnable(){
@Override
public void run() {
if(!isScroll)
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);
}
});

但是这样的滑动效果是默认的,速度和插值器效果都不是自己的,若想改变滑动的速率和效果怎么做呢?
先看代码:

new MyScroller(getContext(), new AccelerateDecelerateInterpolator()).bind(viewPager);class MyScroller extends Scroller {        private static  final int DURATION = 1000;        private static final int DEFAULT_DURATION = 250;        MyScroller(Context context, Interpolator interpolator) {            super(context, interpolator);        }        @Override        public void startScroll(int startX, int startY, int dx, int dy, int duration) {            super.startScroll(startX, startY, dx, dy, isFastScroll ? DEFAULT_DURATION : DURATION);            if(isFastScroll) isFastScroll = false;        }        void bind(ViewPager viewPager) {            try {                Field mField = ViewPager.class.getDeclaredField("mScroller");                mField.setAccessible(true);                mField.set(viewPager, this);            } catch (Exception e) {                e.printStackTrace();            }        }    }

因为ViewPager的滑动效果是通过Scroller实现的,ViewPager类里面有一个mScroller的全局变量,通过这个变量控制每个子view的滑动:

        mScroller.startScroll(sx, sy, dx, dy, duration);

ViewPager的405行对mScroller进行创建初始化

        mScroller = new Scroller(context, sInterpolator);

穿进去一个插值器,用来控制滑动效果,如果不传,Scroller会使用默认的;所以咱们自定义了一个Scroller并实现其构造函数,传进来一个自己想要的插值器AccelerateDecelerateInterpolator,这种插值器,它的变化率开始和结束缓慢,但到中间加速。

然后看反射的代码,先拿到私有的成员变量mScroller,因为反射机制的规定,类中的成员变量为private,故必须进行 mField.setAccessible(true)操作;
mField.set(viewPager, this);相当于ViewPager.setScroller(new MyScroller);

好了,可以去试试了!

-随便写的一些东西,不求能帮助多少人,为了记录下自己的获得,养成个好习惯,若大神发现哪里写的不对,还请勿喷,欢迎指正,不胜感激

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被打耳光后耳鸣怎么办 被打了耳鸣怎么办 打到鼻子流鼻血怎么办 一岁多宝宝有痰怎么办 一岁半咳嗽有痰怎么办 12岁说话不清楚怎么办 梦见前夫打孩子怎么办 小儿咳嗽带痰怎么办 孩子扁桃体发炎咳嗽怎么办 一岁宝宝总有痰怎么办 四岁宝宝总有痰怎么办 5岁宝宝总有痰怎么办 一岁宝宝有痰咳不出怎么办 三岁宝宝有痰咳不出怎么办 孩子不听话打她怎么办 孩子笨上学吃力怎么办 孩子学习就睡着怎么办 孩子对父母大喊大叫怎么办 老师面对熊孩子怎么办 妈妈故意打孩子怎么办 老是被妈妈打怎么办 父母老打骂孩子怎么办 后妈总是欺负我怎么办 小朋友屁股被打紫了怎么办 儿童被咬出血怎么办 小宝宝蚊子咬了怎么办 幼儿被咬了怎么办 把孩子屁股肿打紫怎么办 小孩老是咬小孩怎么办 宝宝对蚊子过敏怎么办 胳膊打红了怎么办 孩子生气摔东西怎么办 爱发脾气摔东西怎么办 宝宝生气扔东西怎么办 人流后屁股疼怎么办 生孩子后膝盖痛怎么办 怀孕初期生气了怎么办 孕晚期天天生气怎么办 孩子拉肚子屁股红怎么办 孩子的屁股红怎么办 婴儿屁股肛门红怎么办